2011-08-26 257 views
18

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

运行时异常不应该被捕获。

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

所有它我不明白为什么NumberFormatException是运行时?

+2

没有代码,没有人可以回答。 – RoflcoptrException

+1

就像编译器不知道某个对象是否为null时,它不知道被解析的字符串是否实际是一个Number。这是一个只会在运行期间发生的例外。 – asgs

+12

@Roflcoptr:他在问为什么NumberFormatException是一个运行时异常,而不是为什么他会得到一个。 – Vache

回答

0

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

+2

我认为这个问题是关于它是RuntimeException的一个子类而不是一个简单的异常,这不是一个检查异常。 –

8

首先,谁告诉你

运行时异常不应该被抓住

不知道很多关于Java的。不要听他们 - 他们错了。

NumberFormatException是一个运行时异常:未选中的异常被选中,因为它们表示编程错误。有可能在之前知道(例如)呼叫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块,如果你确信你不会得到一个,例如如果完全信任String数据的来源。

+7

然而,像'URLFormatThingyException'这样的一些检查过的异常和你有什么可以这么说。总之,这一切都是一团糟。 –

+1

和相同的 - 预先检查 - 也可以说NPE! –

+1

绝对!我总是检查NPE:'if(str!= null && ...)'etc – Bohemian

2

NumberFormatException扩展IllegalArgumentException。这是运行时异常的原因是,完全可能破坏采用String并返回Number的方法的合约。如果我通过123D并且没有适当的数据验证,那么这将是一个合适的非法论证。

3

NumberFormatException也可能在解析配置文件时抛出,在这种情况下,这将是一个程序员错误。在解析用户输入时,通常使用NumberFormat,这会引发选中的ParseException

+0

配置文件并不总是(或者甚至经常)在程序员的控制下,但我认为你的观点是很好的。 Java库提供不同的API来处理来自可信来源的输入与来自不可信来源的输入。 – CurtainDog

+0

是的!幸运的是,找到了这个答案,这就解释了为什么NumberFormat会检查ParseException,而Integer.parseInt会抛出运行时异常。关于配置文件的好点,那就是我相信它是如何设计和使用的 - 用于用户输入的NumerFormat,用于所有其他的Integer.parseInt –

0

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