运行时异常表示合约损坏(如 NPE),如果代码没有错误,则永远不应该抛出异常。它始终指示代码中的错误(与断言相同,但断言用于内部类错误,而运行时用于类的客户端错误)。
永远不应该捕获运行时异常。
另一方面,检查的异常是签名的一部分,应该被捕获和处理。它们可能表示用户输入错误或外部资源问题(如IOException
)。
有了这一切,我不明白为什么NumberFormatException
是运行时?
运行时异常表示合约损坏(如 NPE),如果代码没有错误,则永远不应该抛出异常。它始终指示代码中的错误(与断言相同,但断言用于内部类错误,而运行时用于类的客户端错误)。
永远不应该捕获运行时异常。
另一方面,检查的异常是签名的一部分,应该被捕获和处理。它们可能表示用户输入错误或外部资源问题(如IOException
)。
有了这一切,我不明白为什么NumberFormatException
是运行时?
首先,谁告诉你
永远不应该捕获运行时异常
对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
,如果您确信自己不会得到一个,它不会用可能不必要的块使代码混乱,例如,如果完全信任字符串数据的来源。
NumberFormatException
解析配置文件时也可能抛出,在这种情况下,这将是程序员错误。解析用户输入时,您通常使用NumberFormat
which throws a checked ParseException
。
NumberFormatException 扩展了 IllegalArgumentException。这是运行时异常的原因是完全有可能打破接受 aString
并返回 a的方法的约定Number
。如果我传入123D
并且没有正确验证数据,那么这将是一个适当的非法论点。
为什么 NumberFormatException 是运行时错误?好吧,如果您有一个用户输入值的对话框,并且该值不是数字而是被解析的,那么您会想知道这一点。例外是最好的方法吗?也许不是,但它就是这样。
从某种意义上说,NumberFormatException
是编译时异常。但是,它不是由 Java 编译器抛出,而是在您的程序运行时由格式字符串解析器/编译器抛出。这同样适用于Pattern
正则表达式的其他用途;您的程序正在运行解析器/编译器。
我认为运行时异常发生在计算机硬件进行操作时,然后意识到这是不可能的,所以已经来不及抛出异常,所以程序崩溃了。对于数字格式异常,计算机会尝试将字符串读取为 int。硬件尝试将 char 存储在 int 变量中,这是不可能的。基本上任何涉及硬件的东西,比如 0 上的除法