为什么你可以抛出一个非发生的异常而不是捕获它

时间:2016-11-22 19:30:24

标签: java exception exception-handling

public void throwTest() throws SQLException, IOException {
    try{  
    } catch (SQLException e) {
    }
}

为什么尝试捕获不会发生的异常会产生编译错误,而我可以抛出任何异常,它不会出错?两者都可以在编译时检查,所以如果行为相同,那对我来说会更有意义吗?

在给定的示例中,catch-block将生成编译时错误: 错误:异常SQLException永远不会在相应的try语句的主体中抛出         } catch(SQLException e){

当我删除catch块时,代码编译得很好。这似乎与我不一致。 这种行为有什么特别的原因吗?

2 个答案:

答案 0 :(得分:3)

捕获可以在编译时确定。抛出声明实际上不会在当前方法中抛出,但实际上在某些子类的覆盖方法中。它是以子类形式使用类的契约:它可能抛出该异常,并且需要处理该异常。它还允许儿童班'抛出该方法的方法。

答案 1 :(得分:2)

我不确定我理解你的问题,但我会抓住它。编译器正试图帮助您避免错误。如果您的try块中有代码抛出SQLException,但是您的catch块有一个拼写错误而您正在捕获SLQException,那么您希望编译器标记该错误。这就是为什么它将此标记为错误,您捕获的异常永远不会被抛出。

我认为你的问题的第二部分是,为什么你可以在方法声明的throws子句中放入你想要的任何东西,无论该方法是否实际抛出该异常?我认为有两个原因。首先,方法声明是一个接口,它告诉客户端如何编码它。在完成方法体之前,您可以设置方法声明并将其提供给您的同事。因此,在这种情况下,这不是一个错误,只是一个正在进行的工作。其次,您的类可以实现一个接口,该接口将该方法声明为抛出异常,但在您的特定实现中,您不需要抛出它。同样,这不是错误。