我有以下2个代码片段,我想知道是什么使java编译器(在Eclipse与Java7)显示错误的第二个片段,为什么不是第一个。
以下是代码片段:
片段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'块。
我详细研究了以下问题,但没有提供任何具体原因。
在代码段1中,不需要return语句。在finally块中,Java已经知道在处理finally块之后要做什么:要么继续异常处理,要么跳转到finally块之后的下一条语句。
因此,在代码片段1中,只需将返回语句移出最终块。
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。
只需在方法的末尾添加一个带有返回语句的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;
// }
}
第二个代码段没有返回值。它已被注释为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;
// }
应始终执行finally
块。这是主要原因。异常在catch
块中抛出,但在finally
块掩码异常中执行return
语句。要么删除finally
块,要么将return
语句移出finally
块。
我们使用带有Log4j的springaop来登录我们的应用程序。我在应用程序中实现了@Before、@After、@posterhrowing建议。但我面临以下问题: 当任何异常在catch块中被捕获时,它不会调用@afterhrowing通知来打印错误堆栈跟踪。 我想为catch块中捕获的异常打印“错误堆栈跟踪”。意味着无论何时在try块中发生任何异常并被catch捕获,都应该调用一些建议来打印
嘿StackOverflow社区, 关于抛出异常。一般什么时候抛出和异常,什么时候抓取? 假设我遇到了这样的情况,我不得不退出,因为发生了一些问题,我无法从它中恢复过来。我是投还是接? 我现在就这么做: 这样做对吗?如果我只是抛出异常会更合适吗?对不起,我是例外的新手:)
Scala没有检查异常。但是,当从java调用scala代码时,希望捕获scala抛出的异常。 斯卡拉: Java:
问题 你在一个 except 块中捕获了一个异常,现在想重新抛出它。 解决方案 简单的使用一个单独的 rasie 语句即可,例如: >>> def example(): ... try: ... int('N/A') ... except ValueError: ... print("Didn't work") ...
我有这样的情况,即活动调用管理器类调用提供者。 活动->管理器(带有asyncTask的方法)->提供程序 我应该如何将捕获的异常发送回活动?
问题 你想捕获一个异常后抛出另外一个不同的异常,同时还得在异常回溯中保留两个异常的信息。 解决方案 为了链接异常,使用 raise from 语句来代替简单的 raise 语句。 它会让你同时保留两个异常的信息。例如: >>> def example(): ... try: ... int('N/A') ... except ValueError as e: