【问题标题】:what is the effect that explicits the "throw exception" in the method signature在方法签名中显式“抛出异常”的效果是什么
【发布时间】:2014-11-21 17:58:35
【问题描述】:

--case 1和case 2的效果是一样的,为什么要在方法签名中加入异常声明?


//案例1

public void doSomething() throws Exception {
        //do Something
    }       
public void Caller() {
   try {
     doSomething();
   } catch (Exception e) {
     //handle the exception   
   }
} 

//案例2

public void doSomething() {
        //do Something
    }       
public void Caller() {
   try {
     doSomething();
   } catch (Exception e) {
     //handle the exception   
   }
} 

参考: what is the use of throws Exception

【问题讨论】:

    标签: java exception signature throw


    【解决方案1】:

    throws 声明用于声明您的方法将抛出哪个checked exceptions

    例如,如果我写这段代码:

    public void doSomething() throws SQLException {
    }
    

    任何调用此方法的代码必须有一个 SQLExceptionExceptionThrowable... 的 try/catch 块,或者它可以有自己的 throws 声明这 3 个中的一个。

    【讨论】:

      【解决方案2】:

      在这种情况下,没有什么区别,只是您提醒编译器注意您不会抛出的异常。

      捕获 throw "Exception" 也是一个坏主意 - 在这两种情况下,您都希望处理具有特定含义的特定异常。当你捕捉时,使用 try 块的唯一原因是如果你期望一个特定的异常,那么你应该捕捉那个异常。这样,如果出现一些意外的异常,您就不会尝试以错误的方式处理它。 (相反,你的程序失败了,你知道你必须处理一个条件)当你抛出时,你想抛出一个特定的异常,要么是你自己编造的,要么是具有已知含义的标准异常,所以调用函数知道要处理什么。例如,如果您的 doSomething 可能会抛出 ArrayIndexNotFoundException 并且如果小部件没有被 frobnicated,那么您可能想要捕获 ArrayIndexNotFoundException 并抛出 WidgetNotFrobnicatedException。任何时候你抛出一个异常,你的 javadoc 都应该明确说明什么情况会触发这个问题,这样你的代码的用户就有机会解决这个可能的失败。

      (在一种情况下我可以看到捕获异常,那就是如果您想在意外出现问题时淡出到某种优雅的停止状态 - 在这种情况下,您可以在 catch 块中记录问题,可能会提醒开发人员,并抛出某种“抱歉,出现错误号 3542,请重新启动程序”消息。)

      【讨论】:

      • 你的回答很清楚,除了我的问题,还提供了有用的信息和建议,非常感谢!!
      【解决方案3】:

      如果你的 doSomething 方法有机会抛出异常而你不想捕获它,你应该在方法上添加 this throws Exception。

      【讨论】:

        【解决方案4】:

        除非您想在该方法中立即处理异常,否则最好使用throws [specific Exception],以便可以在代码中进一步处理异常。

        在顶部有一个通用的 Throwable 捕获“优雅地崩溃”以防万一出现问题,这有点司空见惯。

        【讨论】:

        • 永远不要使用throws Exception,原因很简单,这会混淆实际可以抛出的异常,并迫使所有调用者使用过于通用的@987654324 @ 或使用它自己的 throws Exception 传播缺乏清晰度。除非你的意思是他们应该使用throws [some specific Exception]?
        • 是的,我的意思是抛出一些特定的异常,以便可以在调用堆栈的更高层处理它
        • 如果您在回答中澄清这一点,我将删除反对票。 (在您编辑之前我无法删除它。)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多