2

Scanner我最近询问是否有任何可能的方法可以通过使用(线程在这里:)将值分配给字符串变量来获得异常

其中一个人告诉我 CTRL+D 是NoSuchElementException可以抛出 a 的情况。这对我来说是一种特殊情况,因为input.nextLine()返回一个字符串,而一个字符串基本上可以是用户可以在键盘上键入的任何内容,因此人们会认为input.nextLine()抛出异常不是问题。

因此,我决定在我正在编写的程序中添加一些 try catch 块,以防在程序要求输入数字时按下 CTRL+D。

我遇到的问题是,当我捕获 CTRL+D 异常时,Scanner需要刷新,但是如果我刷新Scanner,它将导致 aNoSuchElementException发生,因为不存在新行。我在一个真正的循环中使用这一切,所以我有点卡在岩石和坚硬的地方之间。

我将发布一个版本的代码,input.nextLine()注释掉。如果您按原样运行它,您将获得在Scanner需要刷新时发生的无限循环。如果您取消注释input.nextLine(),那一行代码本身就会导致NoSuchElementException.

import java.util.NoSuchElementException;



private int getMainOptions(){

    System.out.printf("\n********** Main Options **********");
    System.out.printf("\n*%32s*", "");
    System.out.printf("\n*  %-30s*", "[1] Create Customer");
    System.out.printf("\n*  %-30s*", "[2] Create Reservation");
    System.out.printf("\n*  %-30s*", "[3] Display Customer");
    System.out.printf("\n*  %-30s*", "[4] Display Reservation");
    System.out.printf("\n*%32s*", "");
    System.out.printf("\n**********************************");

    while(true){
        try{

            System.out.print("\nChoose Option: ");

            if(input.hasNextInt()){
                return input.nextInt();
            }

            System.out.print("\nInvalid option");
            input.nextLine();
            continue;
        }

        catch(NoSuchElementException e){
            System.out.print("\nAn exception occurred.");
            //input.nextLine();
        } 
    } 


}

除了在 while 循环中创建 Scanner 并在 catch 中将其销毁以在下一次迭代中重新创建之外,可以做些什么来解决这个问题?

4

2 回答 2

0

input.nextLine()当注释掉或何时检查时,代码进入无限循环,input.hasNextLine()因为它处于while(true)循环中,没有任何东西可以阻止它,因为input.nextInt()没有被调用。if(input.hasNextInt())不会等待一个 int,但如果 int 不作为输入出现,则只是跳过 if 语句中的代码。而是试试这个:

while(true){
    try{
        System.out.print("\nChoose Option: ");
        String in=input.nextLine();
        try{
            int i=Integer.parseInt(in);
            return i;
        }catch(NumberFormatException ex)
        {
            System.out.print("\nInvalid option");
        }
    }
    catch(NoSuchElementException e){
        System.out.print("\nAn exception occurred.");
        //input.nextLine();
    } 
} 
}

我希望这会有所帮助,并且我正确理解了这个问题

于 2013-12-04T03:29:21.120 回答
0

我不确定您是否完全掌握用户按下 Ctrl-D 时会发生什么。发生这种情况时,标准输入流将关闭。无法重新打开已关闭的流。即使您创建一个新的Scanner并将其传递进去,System.in它仍然会抛出一个NoSuchElementException.

作为 Linux 用户,如果我在交互式程序中按 Ctrl-D,我希望程序终止。这就是你当时所能做的。

于 2013-12-04T03:31:48.913 回答