我有以下两个代码片段,我想知道是什么让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'块。
我详细研究了以下问题,但他们没有提供任何具体的理由。
答案 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
阻止。