【发布时间】:2019-12-25 16:46:15
【问题描述】:
在我的代码中,我有一个 while 循环,其中嵌套了 3 个 IF 测试,这些测试具有由 ELSE 触发的标志:
[test1] 检查输入值的长度是否正好为 1 [防止用户输入任何内容]
[test2] 检查索引 0 处的输入值是否为数字[我需要一个数字作为输入,但我使用的是 JSWING]
[test3]检查输入值长度是否大于1[2位(10,11,12,...)
num1= JOptionPane.showInputDialog(null,"Please input Guess #" + (counter+1), "0");
while(exit == false || test1 == false || test2 == false || test3 == false) {
if(num1.length() < 1) {
JOptionPane.showMessageDialog(null,"Input required");
num1= JOptionPane.showInputDialog(null,"Please input Guess #" + (counter+1), "0");
}
else {
test1 = true;
}
if(Character.isDigit(num1.charAt(0)) == false) {
JOptionPane.showMessageDialog(null,"Input has to be a number between 0 - 9.");
num1= JOptionPane.showInputDialog(null,"Please input Guess #" + (counter+1), "0");
}
else {
test2 = true;
}
if(num1.length() > 1) {
JOptionPane.showMessageDialog(null,"Input has to be a number between 0 - 9.");
num1= JOptionPane.showInputDialog(null,"Please input Guess #" + (counter+1), "0");
}
else {
test3 = true;
}
if(test1 == true && test2 == true && test3 == true) {
exit = true;
}
我遇到的问题介于第一次和第二次测试之间。当我尝试不输入任何值作为值 [“” / 或者只是有一个空框并按 Enter] 时,它会检测到没有任何内容的错误并显示一次“需要输入”,但是一旦它循环,它就会输出一个 StringIndexOutOfBoundsException 第二个审判 它适用于我尝试过的所有其他情况(无输入 -> 正确,无输入 -> 不正确......)只有连续无输入的情况会使程序崩溃。
据说错误在这一行,但我不明白在哪里,或者如何。
if(Character.isDigit(num1.charAt(0)) == false)
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
at java.base/java.lang.String.charAt(String.java:709)
at oof.Lottery_Swing_FIX.main(Lottery_Swing_FIX.java:56)
固定逻辑
JOptionPane.showMessageDialog(null,"Enter 3 one-digit positive numbers for your 3 guesses");
for(int counter = 0; counter < LIMIT; counter++) {
test = false;
while(exit == false || test == false) {
num1= JOptionPane.showInputDialog(null,"Please input Guess #" + (counter+1), "");
if(num1.length() < 1 || Character.isDigit(num1.charAt(0)) == false || num1.length() > 1) {
JOptionPane.showMessageDialog(null,"Integer between 1-9 required");
}
else {
test = true;
}
if(test == true) {
numberInput = Integer.parseInt(num1);
exit = true;
}
else {
continue;
}
}
【问题讨论】:
-
好吧,如果你不输入任何东西,你要求使用重新输入一些东西(
num1= JOptionPane.showInputDialog(null,"Please input Guess #" + (counter+1), "0");。然后紧接着,你有if(Character.isDigit(num1.charAt(0)) == false) {。所以如果你不输入任何第二次,它都会失败,因为您尝试访问空字符串的第一个字符。 -
我将如何解决这个问题?我理解这个问题,但没有真正的解决方法。我应该为 num1 设置另一个输入吗?
-
重做你的逻辑。您应该在循环中只询问一次该值。它应该看起来像:
boolean valid = false; while (!valid) { num1 = getValue(); valid = validateAndShowErrorMessageIfInvalid(num1); } -
我更新了我的帖子,它现在可以工作了,但是有没有办法添加单独的消息,详细说明输入过程中出现的问题?例如,如果他们有一个空输入,或者他们输入了所有字母。由于现在每个错误都只输出“需要 1-9 之间的整数”
-
当然。在方法 validateAndShowErrorMessageIfInvalid() 中,使用 if 块来检查错误。每次发现错误时,显示相应的错误信息,然后返回 false。按照我的解释重构你的代码。将所有内容放在同一个方法中会使推理变得更加困难,并且不允许在发现错误后立即使用
return。
标签: java swing if-statement indexoutofboundsexception charat