Java 什么是明确的效果,即;“抛出异常”;在方法签名中

Java 什么是明确的效果,即;“抛出异常”;在方法签名中,java,exception,signature,throw,Java,Exception,Signature,Throw,--案例1和案例2的效果相同,为什么需要在方法签名中添加异常声明 //案例1 public void doSomething() throws Exception { //do Something } public void Caller() { try { doSomething(); } catch (Exception e) { //handle the exception } } //案例2 publ

--案例1和案例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   
   }
} 
参考:
除非您希望在该方法中立即处理异常,否则最好使用
抛出[特定异常]
,以便在代码中进一步处理异常


在顶部有一个通用的
可丢弃的
catch是很常见的,它在出现错误时会“优雅地崩溃”。

在这种情况下,除了提醒编译器一个不打算抛出的异常之外,没有什么区别

捕获抛出“异常”也是个坏主意——在这两种情况下,您都希望处理具有特定含义的特定异常。在捕获时,使用try块的唯一原因是如果您预期出现特定异常,那么您应该捕获该异常。这样,如果出现意外异常,您就不会试图以错误的方式处理它。(相反,你的程序失败了,你知道你必须处理一个条件)当你抛出时,你想抛出一个特殊的异常,不管是你自己创建的,还是一个具有已知含义的标准异常,因此调用函数知道该处理什么。例如,如果您的doSomething可能会在小部件未初始化的情况下引发ArrayIndexNotFoundException,则您可能希望捕获ArrayIndexNotFoundException并引发WidgetNotFrobIncatedException。每当抛出异常时,javadoc都应该指定触发该问题的具体情况,这样代码的用户就有机会解决这个可能的故障


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

如果您的doSomething方法有机会抛出异常,但您不想捕获它,则应在该方法上添加此抛出异常。

使用
抛出声明来声明您的方法抛出的异常

例如,如果我编写以下代码:

public void doSomething() throws SQLException {
}

调用此方法的任何代码必须为
SQLException
Exception
Throwable
具有try/catch块。。。或者它可以为这三种类型中的一种使用自己的
throws
声明。

使用
throws Exception
是不好的做法,原因很简单,这会混淆实际可以抛出的异常,并迫使所有调用方都有一个过度通用的
捕获(异常e)
或使用其自身的
引发异常来传播缺乏清晰性。除非你的意思是他们应该使用
抛出[某些特定的异常]
?是的,我的意思是抛出一些特定的异常,以便可以在呼叫堆栈的更高层处理。如果你在回答中澄清这一点,我将删除否决票。(在您编辑之前,我无法删除它。)您的答案很清楚,并且除了我的问题之外,还提供了有用的信息和建议,非常感谢!!