You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java程序抛出NoSuchElementException异常的原因及解决咨询

解决Java Scanner抛出NoSuchElementException: No line found的问题

咱直接点出问题根源:你遇到的这个NoSuchElementException,核心原因是重复关闭了System.in输入流,导致后续无法读取控制台输入。

问题代码分析

拆解下你的代码逻辑:

  1. 在setConnection()方法里,你创建了Scanner teclado = new Scanner(System.in),最后调用了teclado.close()——这里要注意,Scanner的close()方法会连带关闭它底层依赖的输入流,也就是System.in。
  2. 之后调用askToDo()方法时,你又新建了一个Scanner去读取System.in,但此时这个输入流已经被关闭了,自然读不到任何内容,直接抛出No line found异常。

另外还有个小坑:在setConnection()的else分支里,你递归调用了setConnection(),然后又执行了teclado.close(),这会导致递归过程中提前关闭输入流,同样会引发问题。

解决方案

最稳妥的做法是复用同一个Scanner实例,不要每次调用方法都新建然后关闭。具体可以这么改:

  1. 在Client类里声明一个全局的Scanner变量,初始化一次,等到整个程序/线程结束时再关闭它。
  2. 所有需要读取控制台输入的方法,都使用这个全局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:13:57