StackOverflowError extends VirtualMachineError
VirtualMachineError extends Error
public class Error extends Throwable也就是说,你可以在B类里面catch Throwable 就能捕获到StackOverflowError ,参见jdk源码。
VirtualMachineError extends Error
public class Error extends Throwable也就是说,你可以在B类里面catch Throwable 就能捕获到StackOverflowError ,参见jdk源码。
public class A {
public A(){
public String sum(){
try{
xxxxxx
}catch (Exception e){
//其实这是个 StackOverflowError 异常,我想在B类里获取
e.printStackTrace();
//记录日志并把异常往向抛
log.error(e,e);
throw e;
}
}
}
}
//在B里调用A文件的sum方法
public class B {
public B(){
try{
A a = new A();
a.sum();
}catch (Exception e){
e.printStackTrace();
//希望在此获得A里发生的异常,不论什么方法,只能有获得到A里的sum异常message就行
}
}
}
首先你的问题本身就有问题:
捕获就是catch,catch就是捕获,已经被catch的异常,怎么再次catch呢
首先,我看到A的sum函数是有String类型返回值的。
而异常发生时,A的catch块没有返回,所以应该有办法区分是否发生异常,也就是切入时间,此时你去你的log文件或者控制台,抓log,因为你是 e.printStackTrace();所以可以根据堆栈信息拿到你要的message。
馊主意一个,哈哈
等待高手
// A的文件不能发生任何的更改
public class A {
public A(){
}
public String sum(){
try{
if(1==1){
throw new StackOverflowError();
}
return "success";
}catch (Exception e){
//其实这是个 StackOverflowError 异常,我想在B类里获取
e.printStackTrace();
}
return null;
}}//在B里调用A文件的sum方法package dianping;
public class B {
public B(){ try{
A a = new A();
a.sum();
}catch (Throwable e){
System.out.println(" catch error.");
//希望在此获得A里发生的异常,不论什么方法,只能有获得到A里的sum异常message就行
}
}
public static void main(String[] args) {
B b=new B();
}
}
楼主的注释坑爹呀, 为什么注释打到catch块里面,还以为是异常呢被catch到了。
StackOverflowError不是异常好么?
异常(Exception)和错误(Error)是两种不同的东西,但他们都是Throwable的子类。
try-catch语法其实是对于Throwable而言的,所以它既可以捕获Exception也可以捕获Error。
在楼主的例子里既可以使用catch(Throwable e)和可以使用catch(Error e)来捕获这个Error