【问题标题】:Java Scanner Exception [duplicate]Java 扫描程序异常 [重复]
【发布时间】:2024-04-30 10:20:01
【问题描述】:

我正在尝试使用 Scanner 在自己的方法中调用 start() 方法。一旦用户输入一个数字,就会执行一系列操作,然后我希望再次调用 start() 方法。除了我得到这个错误:

我的代码:

    public void start() {
    System.out.println("1. Créer un nouveau réseau");
    System.out.println("2. Créer un nouvel ordi portable");
    System.out.println("3. Créer un nouvel ordi fix");
    System.out.println("4. Créer un Switch \n");
    System.out.print("Choisir un chiffre : ");
    Scanner scan = new Scanner(System.in);
    if(scan.hasNextInt()) {
        int v = scan.nextInt();
        switch(v) {
            case 1:
                addNetwork();
                scan.next();
                start();
                break;
        }
    } else {
        System.out.println("Vous devez rentrer un chiffre !");
        scan.next();
        start();
    }
}

编辑:

这是程序的完整输出:

编辑:

我的 addNetwork 方法:

    private void addNetwork() {
    System.out.print("Quel est l'IP du réseau ? ");
    Scanner scan = new Scanner(System.in);
    String ip = scan.nextLine();
    System.out.print("Quel est le masque du réseau ? (par défaut /24) ");
    String mask = scan.nextLine();
    scan.close();
    web.addNetwork(ip, mask);
}

【问题讨论】:

  • 你用什么作为输入?
  • 我正在使用像 1 这样的 int 值
  • addNetwork 是做什么的?它会创建一个新的 Scanner 吗?
  • 是的,我看看我的答案
  • 问题缺少获得答案所需的代码。您在 Controller 中遇到了异常,但您发布了一些其他的,很可能是不相关的代码。

标签: java exception java.util.scanner


【解决方案1】:

你的addNetwork方法很麻烦。

addNetwork 方法中,您正在关闭扫描仪,它不仅会关闭您的扫描仪,还会关闭您的 System.in 输入流。

参考资料:

java.util.NoSuchElementException - Scanner reading user input

我已经更新了代码,我建议初始化扫描器对象一次,并将其作为参数传递给您的 start 方法,并在完成后关闭 scanner

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
import java.util.stream.Stream;

public class Main {

    private void addNetwork(Scanner scan) {
        System.out.print("Quel est l'IP du réseau ? ");
        String ip = scan.nextLine();
        System.out.print("Quel est le masque du réseau ? (par défaut /24) ");
        String mask = scan.nextLine();
        web.addNetwork(ip, mask);
    }

    public void start(Scanner scan) {
        System.out.println("1. Créer un nouveau réseau");
        System.out.println("2. Créer un nouvel ordi portable");
        System.out.println("3. Créer un nouvel ordi fix");
        System.out.println("4. Créer un Switch \n");
        System.out.print("Choisir un chiffre : ");
        if (scan.hasNextInt()) {
            int v = scan.nextInt();
            switch (v) {
                case 1:
                    addNetwork(scan);
                    scan.next();
                    start(scan);
                    break;
            }
        } else {
            System.out.println("Vous devez rentrer un chiffre !");
            scan.next();
            start(scan);
        }
    }

    public static void main(String args[]) {
        Main main = new Main();
        Scanner scan = new Scanner(System.in);
        main.start(scan);
        scan.close();
    }
}

输出:

1. Créer un nouveau réseau
2. Créer un nouvel ordi portable
3. Créer un nouvel ordi fix
4. Créer un Switch 

Choisir un chiffre : 1
Quel est l'IP du réseau ? Quel est le masque du réseau ? (par défaut /24) 192.168.0.21
TestProgram
1. Créer un nouveau réseau
2. Créer un nouvel ordi portable
3. Créer un nouvel ordi fix
4. Créer un Switch 

Choisir un chiffre : 

【讨论】:

  • 程序本身运行正常但是有2个问题,第一个是addNetwork()方法中的两个问题同时问,start()方法没有重启一次操作结束
  • 一切都很好,我刚刚在您的帮助下解决了问题,非常感谢!
【解决方案2】:

问题出在您的addNetwork 方法中,您在该方法中调用scan.close()。这又会调用System.in.close(),因此无法再从标准输入中读取任何字符。

addNetwork 你应该通过你已经拥有的扫描仪:

private void addNetwork(Scanner scan) {
    System.out.print("Quel est l'IP du réseau ? ");
    String ip = scan.nextLine();
    System.out.print("Quel est le masque du réseau ? (par défaut /24) ");
    String mask = scan.nextLine();
    web.addNetwork(ip, mask);
}

【讨论】:

  • 我删除了addNetwork方法中的scan.close(),代码运行正常但完成后不会重启
  • 在您的start() 方法中,您在addNetwork() 之后调用scan.next(),因此扫描程序需要在调用start() 之前消耗额外的工作。