以下方法会导致No line found Exception
:
private static String getRebaseAnswer(boolean isFirst, boolean isLast) {
System.out.println("Would you like to (c)ontinue, (s)kip this commit, or"
+ " change this commit's (m)essage?");
Scanner in = new Scanner(System.in);
String answer;
while (true) {
answer = in.nextLine(); // <--- This Line
if (answer.equals("c") || answer.equals("m")) {
in.close();
return answer;
} else if (answer.equals("s") && !isFirst && !isLast) {
in.close();
return answer;
} else {
System.out.println("Would you like to (c)ontinue, (s)kip this commit, or"
+ " change this commit's (m)essage?");
}
}
}
我在这个方法中调用方法:
...
String answer;
Scanner in;
currHead = branchHeads.get(arg);
while (toRebase != null) {
System.out.println("Currently replaying:");
toRebase.getNode().printInfo();
answer = getRebaseAnswer(isFirst, toRebase.getParent() == null); // <--- This Line
...
导致错误的原因是什么?在继续getRebaseAnswer
方法之前,扫描仪是否应该等我输入一行?我的代码中的一个不同方法具有与上述方法完全相同的结构,并且没有遇到任何问题。我已经检查了多个关于此问题的其他帖子,但他们的建议与此问题无关或无法解决。
此方法运行没有问题:
private static boolean handleDangerous() {
System.out.println("Warning: The command you entered may alter the files in your"
+ " working directory. Uncommitted changes may be lost. Are you sure you"
+ " want to continue? (yes/no)");
Scanner in = new Scanner(System.in);
String answer;
while (true) {
answer = in.nextLine();
if (answer.equals("yes")) {
in.close();
return true;
} else if (answer.equals("no")) {
in.close();
return false;
} else {
System.out.println("Not a valid answer, please enter (yes/no).");
}
}
}
答案 0 :(得分:3)
当您创建连接到System.in
的扫描仪并将其关闭时,您也会关闭System.in
。因此,后续尝试从System.in
读取将导致您观察到的异常。
方法是避免这是仅创建一次扫描仪,并且在程序完成之前永远不要关闭它。应将此扫描程序传递给需要从System.in
读取的任何功能。
答案 1 :(得分:1)
不要关闭扫描仪,否则Stream也会关闭。
in.close();
从当前位置删除此行并将其放在main方法的末尾,以便关闭所有操作流后..
您可能正在调用已关闭流的其他方法,然后您正在调用此方法。