28

运行时异常表示合约损坏(如 NPE),如果代码没有错误,则永远不应该抛出异常。它始终指示代码中的错误(与断言相同,但断言用于内部类错误,而运行时用于类的客户端错误)。

永远不应该捕获运行时异常。

另一方面,检查的异常是签名的一部分,应该被捕获和处理。它们可能表示用户输入错误或外部资源问题(如IOException)。

有了这一切,我不明白为什么NumberFormatException是运行时?

4

6 回答 6

10

首先,谁告诉你

永远不应该捕获运行时异常

对Java了解不多。不要听他们的——他们错了。

NumberFormatException 是运行时异常:选择未经检查的异常是因为它们表示编程错误。在调用(例如)之前可以知道String一个有效的整数,例如,这只是一种方法:Integer.parseInt()

if (str.matches("^\\d{1,8}$") {
    int myInt = Integer.parseInt(str); // will never throw NumberFormatException 
}

因此,它可以被认为是一个编程错误——程序员选择首先检查。

如果您对要解析的字符串的完整性/质量没有信心,很容易发现:

try {
    // parse your string
} catch (NumberFormatException e) {
    // do something about it
}

使它成为运行时的另一个原因是try/catch,如果您确信自己不会得到一个,它不会用可能不必要的块使代码混乱,例如,如果完全信任字符串数据的来源。

于 2011-08-26T13:51:43.713 回答
2

NumberFormatException解析配置文件时也可能抛出,在这种情况下,这将是程序员错误。解析用户输入时,您通常使用NumberFormatwhich throws a checked ParseException

于 2011-08-26T13:53:41.060 回答
1

NumberFormatException 扩展了 IllegalArgumentException。这是运行时异常的原因是完全有可能打破接受 aString并返回 a的方法的约定Number。如果我传入123D并且没有正确验证数据,那么这将是一个适当的非法论点。

于 2011-08-26T13:52:09.163 回答
-1

为什么 NumberFormatException 是运行时错误?好吧,如果您有一个用户输入值的对话框,并且该值不是数字而是被解析的,那么您会想知道这一点。例外是最好的方法吗?也许不是,但它就是这样。

于 2011-08-26T13:51:22.837 回答
-2

从某种意义上说,NumberFormatException 编译时异常。但是,它不是由 Java 编译器抛出,而是在您的程序运行时由格式字符串解析器/编译器抛出。这同样适用于Pattern正则表达式的其他用途;您的程序正在运行解析器/编译器。

于 2015-11-15T19:29:36.847 回答
-2

我认为运行时异常发生在计算机硬件进行操作时,然后意识到这是不可能的,所以已经来不及抛出异常,所以程序崩溃了。对于数字格式异常,计算机会尝试将字符串读取为 int。硬件尝试将 char 存储在 int 变量中,这是不可能的。基本上任何涉及硬件的东西,比如 0 上的除法

于 2020-07-06T12:17:19.450 回答