扫描仪nextLine()不等待循环输入

时间:2014-04-14 21:01:50

标签: java java.util.scanner

以下代码从System.in获取1,2或3的输入并作出相应的操作,循环试验直到数字" 3(或无效String)"输入,程序退出。我需要使用nextLine()代替nextInt(),以便输入像" 123"或" 123abc"一切都落入了最后的"否则"并导致程序退出。 该程序第一次正常工作,但在第二次迭代时,控制台输出Trial 2:,然后我得到NoSuchElementException: No line found。查看下面的堆栈跟踪。

public static void main(String[] args){
    int trialNumber = 1;

    Scanner s = new Scanner(System.in);
    String input = null;
    while (true) {
        System.out.print("Trial " + trialNumber + ": ");
        input = s.nextLine();
        int type = determineInputType(input); //Parses input and returns 1 2 or 3

        if (type == 1) {
            // ...
        }
        else if (type == 2) {
            // ...
        }
        else {
            System.out.println("Exiting!"); 
            break;
        }
        trialNumber++;
    }
    s.close();

}

这是堆栈跟踪:

Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at edu.iastate.cs228.hw4.InfixPostfix.main(InfixPostfix.java:39)

感谢您的帮助!

编辑:以下是determineInputType(输入)的来源

    private static int determineInputType(String input) {

    switch (input) {
    case "1":
        return 1;
    case "2":
        return 2;
    case "3":
        return 3;
    default:
        System.out.println("Invalid option.");
        return 0;
    }
}

3 个答案:

答案 0 :(得分:4)

您可能正在Scanner方法或determineInputType中的某个位置创建新的// ...

当您关闭Scanner时,它使用的InputStream也会关闭。因此,如果您为Scanner打开System.in然后将其关闭,则其他所有已打开的Scanner将无法再从System.in读取。

示例:

public static void main(String[]args) {
    // [...]
    Scanner s = new Scanner(System.in);
    String myString = s.nextLine();
    determineInputType(myString);
    // [...]
    s.close();
}

public static void determineInputType(String str) {
    // [...]
    Scanner s1 = new Scanner(System.in);
    // [...]

    /* This will affect the 's' Scanner from the 'main' method too
     * as it closes System.in, which is being used from 's' too
     */
    s1.close(); 

}

答案 1 :(得分:0)

我尝试执行此代码

这一行是可能的问题。我直接将输入设置为1(int type = 1;而不是该方法)。 ,然后它按预期工作。

    public class Snippet {
        public static void main(String[] args){
            int trialNumber = 1;

            Scanner s = new Scanner(System.in);
            String input = null;
            while (true) {
      System.out.print("Trial " + trialNumber + ": ");
                 input = s.nextLine();


                int type = determineInputType(input);

                if (type == 1) {
                    // ...
                }
                else if (type == 2) {
                    // ...
                }

                else {
                    System.out.println("Exiting!"); 
                    break;
                }
                trialNumber++;
            }
            s.close();

    }
        private static int determineInputType(String input) {

            switch (input) {
            case "1":
                return 1;
            case "2":
                return 2;
            case "3":
                return 3;
            default:
                System.out.println("Invalid option.");
                return 0;
            }
        }
}

答案 2 :(得分:0)

您的代码中只需要一行:

    public static void main(String[] args){
        int trialNumber = 1;

        Scanner s = new Scanner(System.in);
        String input = null;
        while (true) {
            System.out.print("Trial " + trialNumber + ": ");
            s.nextLine();
            input = s.nextLine();
            int type = determineInputType(input); //Parses input and returns 1 2 or 3

            if (type == 1) {
                // ...
            }
            else if (type == 2) {
                // ...
            }
            else {
                System.out.println("Exiting!"); 
                break;
            }
            trialNumber++;
        }
        s.close();

    }