我是Java的初学者,我遇到了用户控制的do-while循环的问题,该循环接受用户输入重复。这是循环结束时的代码。
System.out.print("Do you wish to continue? (Y for yes " +
"/ N for no)");
input = keyboard.nextLine();
input.length();
repeat = input.charAt(0);
}while (repeat == 'Y' | repeat == 'y');
我知道它因为价值而抛出异常,但无法弄清楚要做些什么来修复它,因为我确信它相对简单。谢谢你的帮助。
编辑1: 堆栈跟踪:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 0
at java.lang.String.charAt(Unknown Source)
at FractionTest.main(FractionTest.java:59)
答案 0 :(得分:1)
看起来你读的空行返回空字符串""
所以那里没有字符(甚至不是第0个)。
通常在您使用nextLine
之后立即使用nextABC
方法,例如nextInt
,因为此类方法不会使用行分隔符,而nextLine
会读取文本直到下一行分隔符(或流的结尾)。
在这种情况下,您可以在nextLine
之后添加nextInt
以消费行分隔符。
无论如何为了避免从空字符串和异常中读取字符,您可以使用类似
的内容} while (input.toLowerCase().startsWith("y"));
而不是
input.length();//this actually doesn't change anything, you can remove it
repeat = input.charAt(0);
} while (repeat == 'Y' | repeat == 'y');
答案 1 :(得分:1)
正如@Phesmo所提到的,你可能会得到0长线。这是一个不起眼的问题。在致电 public $defaultAction = 'manage_timesheet';
之前,您是否曾在扫描仪上致电class A
{
public:
bool operator<(const A& rhs) const {return true;}
};
set<A> s;
int main()
{
s.insert(A());
set<A>::iterator pos;
pos = s.begin();
(A)*pos; // why temporary created here?
return 0;
}
,nextInt()
,nextLong()
,nextShort()
或nextByte()
?
试试这个
nextBoolean()
nextLine()
查找并返回此扫描程序中的下一个完整令牌。完整的标记之前和之后是与分隔符模式匹配的输入。
或者这个
System.out.print("Do you wish to continue? (Y for yes / N for no)");
char ans;
do {
ans = keyboard.next().charAt(0);
// filter input
} while (ans == 'Y' || ans == 'y' || ans == 'N' || ans == 'n');
repeat = ans;
} while (repeat == 'Y' | repeat == 'y');
String Scanner#next()
如果它匹配从指定字符串构造的模式,则返回下一个标记。
System.out.print("Do you wish to continue? (Y for yes / N for no)");
repeat = keyboard.next("[YyNn]").charAt(0);
} while (repeat == 'Y' | repeat == 'y');
是一个字符类模式,它意味着匹配集合中的任何字符。