为什么不必处理`java.lang`包中的类抛出的可能异常?

时间:2016-03-15 00:32:33

标签: java throws

所以,在文档例如:java.lang.Integer.parseInt中,我注意到代码头是:

if (firstBody.categoryBitMask & missileCategory) != 0 &&
        (secondBody.categoryBitMask & alienCategory) != 0 {
            destroyAlien(firstBody.node as? SKSpriteNode, alien: secondBody.node as? SKSpriteNode)
    }
}

但是,如果有一个类似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块来围绕每个Integer.parseInt调用(和其他人),但我确定很好奇为什么编译器允许它。 / p>

2 个答案:

答案 0 :(得分:2)

因为NumberFormatException子类IllegalArgumentException,后者又是RuntimeException的子类。

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

来自RuntimeException javadoc页面:

  

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

答案 1 :(得分:1)

因为这些例外是unchecked

来自附件链接:

  

因为Java编程语言不需要方法   catch或指定未经检查的异常(RuntimeException,Error和   他们的子类),程序员可能会想要编写代码   仅抛出未经检查的异常或使其全部异常   子类继承自RuntimeException。这两个捷径   允许程序员编写代码而不必担心编译器错误   而无需指定或捕获任何异常。虽然   这似乎对程序员来说很方便,它避开了意图   捕获或指定要求并可能导致其他人的问题   使用你的课程。