/**
* Shortens input by only having one letter in the output.
*If user inputs blank answer, default is size Small.
*/
if (!burgerSize.isEmpty()) {
burgerSize = burgerSize.trim().toUpperCase();
burgerSize = burgerSize.substring(0, 1);
}
当我在项目中执行此操作时,命令行说:
线程“main”中的异常java.lang.StringIndexOutOfBoundsException ...字符串索引超出范围:1
at java.lang.String.substring(String.java:1 ...)
在BurgerOrder.main(BurgerOrder.java:66)“
如果我切换线条,它就不会这样做......但我的老师告诉我在子串之前修剪字符串。
if (!burgerSize.isEmpty()) {
burgerSize = burgerSize.substring(0, 1);
burgerSize = burgerSize.trim().toUpperCase();
}
这是我原来的,没有错误。我应该保持原样并接受我失去的分数吗?
更新:让我澄清一下。如果用户输入字母S,如此"ssss"
,它将缩短并大写为“S”。对于M "mmmmm"
等同样的事情。我知道我在用我的代码做什么。我只是想知道我的教授建议的是错的(他正在阅读我打印出来的代码)。
答案 0 :(得分:1)
String方法isEmpty()
仅检查字符串是否包含任何字符,甚至不包含空格。例如,如果burgerSize = " "
(注意引号之间的空格),那么对trim()
的调用将删除该空格,并且您对substring(0, 1)
的调用将失败,因为字符串为空,即使它你第一次检查它时不是空的。
尝试将trim()
移到if语句之上,如下所示:
burgerSize = burgerSize.trim();
if (!burgerSize.isEmpty())
{
burgerSize = burgerSize.substring(0, 1).toUpperCase();
}
答案 1 :(得分:0)
trim会删除空格等空格。当burgerSize以空格开头时,它在该点不是空的,因此它通过了not isEmpty测试。但是当你剪掉空间时,burgerSize变空了,所以尝试取第一个字母就失败了。首先尝试修剪,然后检查是否为空。
祝你好运!答案 2 :(得分:0)
为了安全起见,您应该在执行子字符串之前修剪字符串。考虑:
/**
<P>{@code java TrimBeforeSubstrXmpl}</P>
**/
public class TrimBeforeSubstrXmpl {
public static final void main(String[] igno_red) {
test("sssssssss");
test(" sssssssss");
}
private static final void test(String s_s) {
System.out.println("Testing \"" + s_s + "\"");
s_s = s_s.substring(0, 1);
System.out.println(" Substring: \"" + s_s + "\"");
s_s = s_s.trim().toUpperCase();
System.out.println(" Trimmed then uppercase: \"" + s_s + "\"");
}
}
输出:
[C:\java_code\]java TrimBeforeSubstrXmpl
Testing "sssssssss"
Substring: "s"
Trimmed then uppercase: "S"
Testing " sssssssss"
Substring: " "
Trimmed then uppercase: ""