为什么我会找到"没有找到行"这段代码有例外吗?

时间:2015-04-14 08:13:38

标签: java input java.util.scanner

以下方法会导致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).");
        }
    }
}

2 个答案:

答案 0 :(得分:3)

当您创建连接到System.in的扫描仪并将其关闭时,您也会关闭System.in。因此,后续尝试从System.in读取将导致您观察到的异常。

方法是避免这是仅创建一次扫描仪,并且在程序完成之前永远不要关闭它。应将此扫描程序传递给需要从System.in读取的任何功能。

答案 1 :(得分:1)

不要关闭扫描仪,否则Stream也会关闭。

in.close();

从当前位置删除此行并将其放在main方法的末尾,以便关闭所有操作流后..

您可能正在调用已关闭流的其他方法,然后您正在调用此方法。