【问题标题】:Why doesn't my try catch statement work?为什么我的 try catch 语句不起作用?
【发布时间】:2018-07-10 09:33:38
【问题描述】:

该程序相当简单,我只是一个测试 try-catch 语句的初学者,尽管我已经阅读了 2 天,但我仍然无法理解为什么这个特定的 try 语句对我不起作用。我知道我可以使用 String 而不是 int,但我想知道为什么它对此不起作用,以及如何使它起作用。 本质上我希望用户输入 1 或 2,如果他们输入 1,程序(测验)将开始,否则如果他们按 2,程序将终止。如果他们按其他任何东西,例如一个字母,另一个数字,或试图做任何其他事情,它会说“再试一次”并重复相同的循环。

这似乎是一个愚蠢的问题,但我对此很陌生,如果能提供一些清晰的信息,我将不胜感激。

Scanner scanner = new Scanner(System.in);
int score = 0;

System.out.println("Are you ready for a quiz?\n1.yes\n2.no");
int input = scanner.nextInt();

do {
    scanner.nextInt();
        try {

            if (input == 2) {
                System.out.println("Maybe next time!");
                System.exit(0);
            } else if (input == 1) {
                System.out.println("Okay! good luck!\n");
            }

        } catch (InputMismatchException e) {
            System.out.println("Invalid input. Try again\n");
        }
} while (input != 1);

【问题讨论】:

  • try/catch 块中的任何内容都不会抛出 InputMismatchException。
  • 您需要将nextInt 调用移入 try 块,因为nextInt 可能会引发异常。 (或者,使用hasNextInt 主动检查,而不是被动地捕获异常。)
  • 你不需要 try catch,只需要一个额外的 else 块

标签: java


【解决方案1】:

1。有什么问题?

要看到Invalid input. Try again InputMismatchException 必须被扔到try 块内,它不会发生,因为输入没有进入if 或else if,你期望的可以用

try {
   if (input == 2) {
       System.out.println("Maybe next time!");
       System.exit(0);
   } else if (input == 1) {
       System.out.println("Okay! good luck!\n");
   }else{
       throw new InputMismatchException();
   }
} catch (InputMismatchException e) {
   System.out.println("Invalid input. Try again\n");
}

2。如何处理这种用法?

但Exception 不必作为正常行为使用,要准备拥有Strings,您需要:

System.out.println("Are you ready for a quiz?\n1.yes\n2.no");
String input;
do {
    input= scanner.nextLine();
    if (input.equals("2")) {
       System.out.println("Maybe next time!");
       System.exit(0);
    } else if (input.equals("1")) {
       System.out.println("Okay! good luck!\n");
    }else{
        System.out.println("Invalid input. Try again\n");
    }     
} while (!input.equals("1"));

3。如何改进?

你可以改变一些print的位置,所以可以简化为:

System.out.println("Are you ready for a quiz?\n1.yes\n2.no");
String input;
do {
    input= scanner.nextLine();
    if (input.equals("2")) {
       System.out.println("Maybe next time!");
       System.exit(0);
    } 
    System.out.println("Invalid input. Try again\n");             
} while (!input.equals("1"));
System.out.println("Okay! good luck!\n");

【讨论】:

  • 这不起作用。如果我输入一个字母,它仍然会崩溃。它仅在我输入另一个数字(不是 1 或 2)时才有效。有什么建议吗?
  • @Avan 您需要从输入中获取字符串,请参阅我的编辑
  • 有什么方法可以在不使用字符串的情况下实现我想要的,并且只使用 int 吗?我只是想从逻辑的角度知道。很固执xd
  • @Avan 你说你希望能够输入字符串这样的字母......因为使用 try/catch 作为正常过程绝对不是一个好主意
  • 虽然可以在控制台中输入字母,但我不希望它崩溃。相反,我想知道它是否可以再次循环,直到用户输入一个整数?我只是好奇。
【解决方案2】:

我将 int 方法转换为 String。我以为我可以只用一个 int 方法来实现同样的事情,但我做不到。谢谢大家,现在是这样的:

enter code hereScanner scanner = new Scanner(System.in);


    System.out.println("Are you ready for a quiz?\n1.yes\n2.no");
    String input;

    do {
        input = scanner.nextLine();
        if(input.equals("2")) {
            System.out.println("Maybe next time!");
            System.exit(0);
        } else if (input.equals("1")) {
            System.out.println("Okay! good luck!\n");
        }


        else { System.out.println("Invalid input. Try again\n");
        } 

    } while (!input.equals("1"));

【讨论】:

    【解决方案3】:

    Catch 块仅在 try 块抛出匹配异常时执行。 在这种情况下,不会发生异常。

    【讨论】:

      【解决方案4】:

      在 else 块中抛出异常,你错过了。 如下,

           try {
           if (input == 2) {
         System.out.println("Maybe next time!");
          System.exit(0);
          } else if (input == 1) {
           System.out.println("Okay! good luck!\n");
          }else{
           throw new InputMismatchException();
         }
         } catch (InputMismatchException e) {
        System.out.println("Invalid input. Try again\n");
       }
      

      【讨论】:

        【解决方案5】:

        您正在捕获特定异常,即 InputMismatchException,但您的 try 块没有可以抛出此异常的代码,要处理这种情况,您必须强制抛出该异常,以便您的 catch 块可以处理该异常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-18
          • 2017-06-12
          • 2022-01-21
          相关资源
          最近更新 更多