2016-12-29 57 views
0

当我运行下面的代码:扫描器无法读取我的输入

Startup(由main()叫):

import java.util.ArrayList; 

public class Startup { 

    public void start() { 

     // Build rooms 
     final int WIDTH = 2; 
     final int HEIGHT = 2; 
     Room[][] room = new Room[WIDTH][HEIGHT]; 
     Rooms.build(room, WIDTH, HEIGHT); 
     int x = 0; 
     int y = 0; 

     // Print starting room description 
     Rooms.print(room, x, y); 

     // Start game loop 
     boolean playing = true; 
     while (playing) { 

      // Get user input 
      String input = Input.getInput(); 
      System.out.println(input); 

      // Movement commands 
      if (input.equals("n")) { 
       if (y > 0) { 
        y--; 
        Rooms.print(room, x, y); 
       } else { 
        System.out.println("You can't go that way."); 
       } 
      } 
     } 
    } 
} 

Input

import java.util.Scanner; 

public class Input { 

    public static String getInput() { 

     System.out.print("> "); 
     try(Scanner in = new Scanner(System.in)) { 
      String input = in.nextLine(); 
      input.toLowerCase(); 
      return input; 
     } 
    } 
} 

我总是会得到这个NoSuchElementException

java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Scanner.java:1540) 
    at Input.getInput(Input.java:11) 
    at Startup.start(Startup.java:36) 
    at Driver.main(Driver.java:11) 

如果start()中的移动命令部分被移除,则一切正常。但是当这部分被包括在内时,这个例外总是被调用,导致我认为它有什么问题。但我的问题是:怎么了?

+1

您是否真的输入了任何数据?请注意,如果你想小写输入,你应该做'input = input.toLowerCase();'。目前你的代码没有这样做。 –

回答

6

您每次拨打getInput时都会创建一个新扫描仪。不幸的是,您每次都会关闭它:

try(Scanner in = new Scanner(System.in)) { 
     String input = in.nextLine(); 
     input.toLowerCase(); 
     return input; 
    } 

此构造称为“尝试使用资源”。它创建了Scanner,这是一个Closeable对象,并且在try块的末尾,它关闭了它。

这意味着扫描仪后面的输入流也被关闭。

一旦你关闭了一个流,它不能被重新打开。来自该流的每个输入请求将返回“文件结束”条件。因此,每次在第一个扫描仪之后打开一个新的扫描仪时,在相同(关闭)System.in上,您将得到一个位于“文件末尾”的空扫描仪。

您需要做的只是打开扫描仪一次。然后,对于程序的其余部分,从相同的开放式扫描仪读取。要做到这一点,您必须将所有程序都放在try-with-resources中,或者根本不要使用try-with-resources。

+0

我想OP是关闭扫描仪的,因此system.in也关闭了,但是找不到关闭扫描仪的代码行,直到你解释了'Try with resources'的东西。谢谢! – Yazan

+0

该死的,我从来没有注意到'Scanner.close()'也在关闭使用的输入流。 – AxelH

+0

啊,我不知道用资源尝试关闭输入流,我补充说,以解决资源泄漏。无论如何,谢谢你的帮助! – paper1111