2016-03-15 47 views
1

因此,例如在文档中:java.lang.Integer.parseInt,我注意到代码首是:为什么你不必处理`java.lang`包中的类引发的可能异常?

public static int parseInt(String s) throws NumberFormatException 

然而,当一个人有这样的声明:int i = Integer.parseInt(someString);代码编译罚款没有try-catch块。现在

,在另一方面,如果我写与标题的方法:

public void connectTo(String ip) throws java.net.HostNotFoundException 

,并给它一个呼叫而不围绕着一个适当的try-catch块调用,编译器是不会有它。我并不是建议我(或任何人)想要将每个呼叫(和其他人)与try-catch块都包围起来,但我确定很好奇为什么编译器允许它。

+1

您需要阅读关于选中和未选中的例外的教程。 –

回答

2

由于NumberFormatException亚类IllegalArgumentException,这反过来又子类RuntimeException

RuntimeException的子类与Exception不同,不需要明确捕获(虽然它们可以)。

RuntimeException的javadoc页面:

的RuntimeException及其子类是未经检查的异常。未经检查的异常不需要在方法或构造函数的throws子句中声明,如果它们可以通过执行方法或构造函数来抛出并传播到方法或构造函数边界之外。

1

因为这些异常是unchecked

从附链接:

因为Java编程语言不要求方法 捕捉或指定unchecked异常(RuntimeException的,错误和 它们的子类),程序员可能会试图编写代码, 仅抛出未经检查的异常,或使其所有异常 子类从RuntimeException继承。这两个快捷方式 都允许程序员编写代码,而不会打扰编译器错误 ,而且不会打扰指定或捕获任何异常。虽然 这对编程人员来说看起来很方便,但它回避了捕获或指定要求的意图,并可能导致其他人使用您的类的问题 。