【问题标题】:Flow of handling exception异常处理流程
【发布时间】:2016-05-20 01:28:59
【问题描述】:

有谁知道为什么控制台输出在打印exception 之前再显示一次菜单?

我除了输出应该是:

1. item 1
2. item 2
3. Quit
Please choose a item:
WRONGINPUT         <---- user input
Invalid input      <---- where I want the exception shows
1. item 1
2. item 2
3. Quit
Please choose a item:

但是,我得到的是:

1. item 1
2. item 2
3. Quit
Please choose a item:
WRONGINPUT         <---- user input
1. item 1
2. item 2
3. Quit
Please choose a item:
Invalid input      <---- why the exception is shown here?

代码如下:

    // code omitted

    Scanner scanner = new Scanner(System.in);
    int mainMenu = -1;
    do {    
        try {
            System.out.println("1. item 1");
            System.out.println("2. item 2");
            System.out.println("3. Quit");
            System.out.println("Please choose a item:");
            mainMenu = scanner.nextInt();
        } catch (InputMismatchException e) {
            scanner.nextLine(); 
            System.err.println("Invalid input");        
        }
            if (mainMenu == 1)
                // do something
            else if (mainMenu == 2)
                // do something
            else if (mainMenu == 3)
                System.out.println("Quitting...");
    } while (mainMenu != 3);

【问题讨论】:

  • 可以添加scanner的初始化吗?
  • scanner 的初始化在do-while 循环之上。但仍然得到这个不正确的流程
  • @TDG 是的,我从 Eclipse 运行它。我附上了上面的输出屏幕。
  • 我不知道为什么 Eclipse 会这样。从命令行运行它,一切都会好起来的。

标签: java exception


【解决方案1】:

这是答案。请运行这个程序。

package java7.demo;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

public class Test {

    public static void main(String args[]){
        int mainMenu = -1;
         Scanner scanner = new Scanner(System.in);

    do {    
        try {
            System.out.println("1. item 1");
            System.out.println("2. item 2");
            System.out.println("3. Quit");
            System.out.println("Please choose a item:");
            mainMenu = scanner.nextInt();
            if (mainMenu == 1){
                // do something
            }
            else if (mainMenu == 2){

            }
                // do something
            else if (mainMenu == 3){
                System.out.println("Quitting...");
            }else{
                throw new InputMismatchException();
            }
        } catch (InputMismatchException e) {

            System.err.println("Invalid input"); 
            scanner.nextLine(); 
        }

    } while (mainMenu != 3);
    }
}

只需要修改err print语句下的scanner.nextLine()即可。

【讨论】:

  • 不,当我在 Eclipse 中运行它时,它并没有显示出任何区别。
  • 我为您添加了新的图像屏幕截图。请查看我的控制台,这就是您想看的答案。
【解决方案2】:

我的代码在命令中运行时的顺序没有问题。

我发现原因是 System.err.println 在 Eclipse 中很重要。当我将其更改为System.out.println 时,我得到了正确的输出顺序。但我认为没有必要,因为这是 Eclipse 的问题。

Console Printing Order in Eclipse

这个链接给了我原因。无论如何感谢您的帮助。干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多