在catch块中抛出相同的异常

时间:2015-11-19 09:20:18

标签: java exception exception-handling try-catch

我有以下两个代码片段,我想知道是什么让java编译器(在Eclipse中使用Java 7)显示第二个代码段的错误,为什么不显示第一个代码片段。

以下是代码段:

摘录1

public class TestTryCatch {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(get());
    }

    public static int get(){
        try{
            System.out.println("In try...");
            throw new Exception("SampleException");
        }catch(Exception e){
            System.out.println("In catch...");
            throw new Exception("NewException");
        }
        finally{
            System.out.println("In finally...");
            return 2;
        }
    }
}

摘录2

public class TestTryCatch {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(get());
    }

    public static int get(){
        try{
            System.out.println("In try...");
            throw new Exception("SampleException");
        }catch(Exception e){
            System.out.println("In catch...");
            throw new Exception("NewException");
        }
//      finally{
//          System.out.println("In finally...");
//          return 2;
//      }
    }
}

在eclipse中,snippet1显示为finally块添加'SuppressWarning',但是在snippet2中,它显示为catch块中的 throw 语句添加'throws或try-catch'块。

我详细研究了以下问题,但他们没有提供任何具体的理由。

3 个答案:

答案 0 :(得分:3)

第二个代码段没有返回值。它已经被finally子句注释掉了。

试试这个

public static int get(){
    try{
        System.out.println("In try...");
        throw new Exception("SampleException");
    }catch(Exception e){
        System.out.println("In catch...");
        throw new Exception("NewException");
    }
    return 2;   // must return a value
//      finally{
//          System.out.println("In finally...");
//          return 2;
//      }

答案 1 :(得分:2)

在代码段1中,您不需要return语句。在finally块中,一旦处理了finally块,Java就已经知道该怎么做了:要么继续异常处理,要么跳转到finally块之后的下一个语句。

因此,在代码段1中,只需将return语句移出finally块。

public static int get(){
    try {
        System.out.println("In try...");
        throw new Exception("SampleException");
    } catch(Exception e) {
        System.out.println("In catch...");
        throw new Exception("NewException");
    } finally{
        System.out.println("In finally...");
    }

    return 2;
}

在代码段2中,每个块中都会抛出异常。由于未检查此异常,因此必须在方法概要中指出。另外,没有return语句,方法的返回值不是 void

只需在方法的末尾添加一个带有return语句的throws语句。

public static void get() throws Exception {
    try{
        System.out.println("In try...");
        throw new Exception("SampleException");
    }catch(Exception e){
        System.out.println("In catch...");
        throw new Exception("NewException");
    }
    //      finally{
    //          System.out.println("In finally...");
    //          return 2;
    //      }
}

答案 2 :(得分:2)

finally始终执行。这是主要原因。 catch块中抛出异常,但在return块掩码异常中执行finally语句。删除finally阻止或将return语句移出finally阻止。