【问题标题】:NumberFormatException - try/catch for parse valueNumberFormatException - 尝试/捕获解析值
【发布时间】:2020-11-06 08:38:00
【问题描述】:

我对 Java 和编程非常陌生。我正在做一个练习来打印以控制台乘法选项卡。我想检查用户选择。我一直在寻找不同的 stackoverflow 以前的帖子,这些帖子对我走得更远有很大帮助。但是,当我测试程序时,它会抛出异常:

线程“主”java.lang.NumberFormatException 中的异常:对于输入 字符串:“p”在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java.lang.Integer.parseInt(Integer.java:580) 在 java.lang.Integer.parseInt(Integer.java:615) 在 TableMultiplication.main(TableMultiplication.java:18)

拜托,你能告诉我我错过了什么吗?错误消息要求我创建断点。没看懂。

提前谢谢你

import java.util.Scanner;
import java.util.InputMismatchException;

public class TableMultiplication {
    public static void main(String[] args)
    {
        int table = -1;
        boolean wrongSelection = true;
        Scanner myObj = new Scanner(System.in);

        System.out.println("Multiplication tab will be shown to console ");

        do{
            System.out.print("Enter the tab number you want, between 1 and 9 ");
            while (wrongSelection) {
                try {
                    String value = myObj.nextLine();
                    table = Integer.parseInt(value);
                    wrongSelection = false;
                }
                catch(InputMismatchException e){
                    System.out.println("Please, enter a number ");
                    myObj.nextLine();
                }
            }
        } while(table < 1 || table > 9);

        for(int i = 1; i < 11; i++) {
            System.out.println(table + " x " + i + " = " + table * i);
        }

    }
}

【问题讨论】:

  • 好像您输入了“p”作为输入。即使您使用了 try-catch 块,您也没有包含当输入字符串无法解析为整数时 Integer.parseInt(String s) 实际抛出的异常 - NumberFormatException。因此,您不会捕获此异常。
  • Scanner#nextLine() 甚至没有抛出 InputMismatchException 我可以看到,你为什么要在这里抓住它?
  • 你好@maloomeister 我输入“p”来测试我的程序。我想看看出现异常时它是如何工作的。正如我所写的,我非常初学者(两周前开始使用 Java)。令人难以置信的是人们如何拒绝初学者提出的问题。初学者的问题并不意味着以前没有做过深入的研究。
  • 不用担心,但没有否决您的问题。将来,请检查参考资料,因为它们总是会为您提供最有用的信息。
  • 是的。例如,我在 cmets 中提到的链接为您提供了所需的所有信息。

标签: java exception try-catch


【解决方案1】:
try {
                String value = myObj.nextLine();
                table = Integer.parseInt(value);
                wrongSelection = false;
            }
            catch(Exception e){
                System.out.println("Please, enter a number ");
                myObj.nextLine();
            }

【讨论】:

  • 非常感谢@Baungo。如果我理解得很好,如果我只写 Exception 它将适用于所有特定的 Exceptions 吗?
  • 是的,因为所有异常都从 Exception 继承,您总是可以捕获 Exception。但这也是您应该尽可能避免它的原因,因为它可能会隐藏您不期望的其他异常。就像 myObj.nextLine() 在本例中可能抛出 NullPointerException 一样,您不会注意到并假设 Integer 解析出现异常。
  • 在这种情况下,像这样捕获两个异常会更好:catch(NumberFormatException|InputMismatchException e)
【解决方案2】:

如果你试图输入一个非数字的字符串值,你会得到 NumberFormatException 的异常。在您的情况下,异常意味着您输入了一个无法解析为整数值的 'p' 字符。如果您输入“1”、“32”和“您要输入的数字”;会有通过的。 有一个 catch 块,它只捕获 InputMismatchException,但不能捕获其他异常。您还可以将 InputMismatchException 更改为 Exception,它是捕获其他异常的父级,例如 NumberFormatException 或其他。

【讨论】:

    【解决方案3】:

    您正在捕捉InputMismatchException,但输入字母而不是数字会引发NumberFormatException

    您可以使用通用的catchexception:

    try {
    }
    catch(Exception e){ //<-- Generic exception
    }
    

    或者使用多个catch块:

    try {
    }
    catch(InputMismatchException | NumberFormatException e ){ //<-- Multiple exceptions
    }
    

    已更新以解释为什么 InputMismatchException 不起作用:

    这个exception确实是检查Scanner读取的值是否和你想要的类型匹配。但是在您的代码中,您使用 .nextLine() 方法,该方法需要一个“新行”。

    这些新行是String,可以由字母、数字组成...这就是为什么不引发异常的原因。类型与scanner匹配。

    如果您只想使用这个exception 进行检查,您可以使用这个:

    try {
        scanner.nextInt();
    } catch (InputMismatchException e) {
    
    }
    

    使用此方法,如果您键入 String,则会引发异常,因为您的 Scanner 需要 int

    【讨论】:

    • 非常感谢你的作品。当我在互联网上阅读时,我在想 InputMismatchExcept 正在检查输入。我将学习它们之间的区别。再次感谢@J.F.
    • 不客气。我已经更新了答案来解释这一点,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2012-06-20
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多