2
package sandbox2;

import java.util.Scanner;

public class Sandbox2
{
    public static void main(String[] args)
    {
        for (int i = 0; i < 5; i++)
        {
            String s = askForProperty("Enter value for " + i + ": ");
            System.out.println(i + " is: " + s);
        }

    }

    private static String askForProperty(String message)
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.print(message);
        String s = keyboard.nextLine();
        keyboard.close();

        return s;
    }
}

当我运行上面的代码时,它会完美地返回第一个响应。当它尝试请求第二个响应时,它返回:

java.util.NoSuchElementException: No line found

为什么会返回此错误?每次调用方法 askForProperty 时,Scanner 都是一个全新的实例!它与 System.in 作为输入流有关吗?

4

3 回答 3

0

将您的扫描仪定义为类变量,然后仅在完成所有迭代后关闭它。在您当前的设置中,当您打电话时,keyboard.close您也会关闭System.in,这使得它以后无法使用。

package sandbox2;
import java.util.Scanner;

public class Sandbox2 {
    static Scanner keyboard = new Scanner(System.in); // One instance, available to all methods

    public static void main(String[] args)  {
        for (int i = 0; i < 5; i++) {
            String s = askForProperty("Enter value for " + i + ": ");
            System.out.println(i + " is: " + s);
        }
        keyboard.close(); //Only close after everything is done.
    }

    private static String askForProperty(String message) {
        System.out.print(message);
        String s = keyboard.nextLine();
        return s;
    }
}
于 2014-02-11T18:41:42.267 回答
0

关闭 aScanner会导致底层证券InputStream也被关闭。由于只有一个System.in,任何新创建的 Scanner 对象将无法从同一流中读取:

keyboard.close();

最后关闭Scanner

于 2014-02-11T18:48:42.613 回答
0

所以,

您的代码中的主要问题是您Scanner在每次迭代中都立即创建和关闭。那根本行不通。想象一下Scanner与您的 IO 的大型连接,需要相当多的组装。如果您每次都打开/关闭它 - 您可能会发现在再次打开连接之前触发下一个命令的情况。它也与您在数据库连接中可能发现的非常相似。防止它的方法是在开始迭代之前打开 Scanner,完成循环然后关闭它。

因此,从 askForProperty() 函数中删除 close() 语句并将其移至 main。将扫描仪键盘对象传递给函数。一旦所有迭代都结束 - 然后关闭它。

import java.util.Scanner;

public class Sandbox2
{
    public static void main(String[] args)
    {
        Scanner keyboard = new Scanner(System.in); // Initialize the Scanner
        for (int i = 0; i < 5; i++)
        {
            String s = askForProperty("Enter value for " + i + ": ", keyboard); // Pass the Scanner
            System.out.println(i + " is: " + s);
        }
        keyboard.close(); // Close the Scanner now that the work is done.
    }

    private static String askForProperty(String message, Scanner keyboard)
    {
        System.out.println(message);
        String s = keyboard.nextLine();
        return s;
    }
}
于 2014-02-11T18:53:59.367 回答