Java程序抛出NoSuchElementException异常的原因及解决咨询
解决Java Scanner抛出NoSuchElementException: No line found的问题
咱直接点出问题根源:你遇到的这个NoSuchElementException,核心原因是重复关闭了System.in输入流,导致后续无法读取控制台输入。
问题代码分析
拆解下你的代码逻辑:
- 在
setConnection()方法里,你创建了Scanner teclado = new Scanner(System.in),最后调用了teclado.close()——这里要注意,Scanner的close()方法会连带关闭它底层依赖的输入流,也就是System.in。 - 之后调用
askToDo()方法时,你又新建了一个Scanner去读取System.in,但此时这个输入流已经被关闭了,自然读不到任何内容,直接抛出No line found异常。
另外还有个小坑:在setConnection()的else分支里,你递归调用了setConnection(),然后又执行了teclado.close(),这会导致递归过程中提前关闭输入流,同样会引发问题。
解决方案
最稳妥的做法是复用同一个Scanner实例,不要每次调用方法都新建然后关闭。具体可以这么改:
- 在Client类里声明一个全局的Scanner变量,初始化一次,等到整个程序/线程结束时再关闭它。
- 所有需要读取控制台输入的方法,都使用这个全局Scanner,不要再手动关闭。
示例代码如下:
public class Client extends Thread { // 全局Scanner,只初始化一次 private Scanner teclado; public Client() { teclado = new Scanner(System.in); } private String askToDo() { System.out.print("What would you like to do? [help]: "); String a = teclado.nextLine().toLowerCase(); // 这里不要关闭Scanner! return a; } private void setConnection() { System.out.print("New server [N] or Connect previous server [P]: "); final String typed = teclado.nextLine().toLowerCase(); if (typed.equals("n")) noHaveServers(teclado); else if (typed.equals("p")) { if (ServerList.getAllServers(CONFG).size() == 0) noHaveServers(teclado); else haveServers(teclado); } else { System.out.println("Sorry, I can't understand you."); setConnection(); } // 这里也不要关闭Scanner! } @Override public void run() { try { setConnection(); String action = askToDo(); // 执行你的业务逻辑... } finally { // 线程结束时再关闭Scanner if (teclado != null) { teclado.close(); } } } public static void main(String[] args) { new Client().start(); } }
关键提醒
只要你的程序还需要从控制台读取输入,就绝对不要关闭关联System.in的Scanner——一旦关闭System.in,整个JVM里就再也无法读取控制台输入了,任何后续的Scanner都会抛出类似异常。
内容的提问来源于stack exchange,提问作者titianvalero
相关产品推荐
相关产品推荐

