比较getMessage,getCause,toString,printStackTrace四个方法区别
先说下结论:
e.getMessage():获取错误描述,该错误描述可以通过参数message设置
e.toString():获取异常类型+错误描述,例如java.lang.RuntimeException: myMessage
e.printStackTrace():将这个throwable及其回溯打印到标准错误流,第一行是异常类型+错误描述,第二行是抛出异常地方,最后一行是第一个调用方法,第二行到最后一行是传播的方法栈,如果有cause,则cause拼接在最后一行下面,以此类推。
e.getCause:返回此throwable的原因,或者null
原因不存在或未知
代码验证
情况1:没有异常转义
public static void f1(){
throw new RuntimeException("myMessage");
}
public static void f2(){
f1();
}
public static void main(String[] args) {
try{
f2();
}catch (Exception e){
System.out.println("e.getMessage:");
System.out.println(e.getMessage());
System.out.println("toString:");
System.out.println(e.toString());
System.out.println("printStackTrace:");
e.printStackTrace();
System.out.println("cause:");
System.out.println(e.getCause());
}
}
输出:
1:e.getMessage:
myMessage
2:toString:
java.lang.RuntimeException: myMessage
3:printStackTrace:
java.lang.RuntimeException: myMessage
at com.suyan.sca.MopFacadeTest.f1(MopFacadeTest.java:46)
at com.suyan.sca.MopFacadeTest.f2(MopFacadeTest.java:49)
at com.suyan.sca.MopFacadeTest.main(MopFacadeTest.java:54)
4:cause:
null
情况2:有异常转义
static class MyException extends RuntimeException{
MyException(String message){super(message);}
}
public static void f1(){
throw new RuntimeException("myMessage");
}
public static void f2(){
try{
f1();
}catch (RuntimeException e) {
throw new MyException("我的异常");
}
}
public static void main(String[] args) {
try{
f2();
}catch (Exception e){
System.out.println("e.getMessage:");
System.out.println(e.getMessage());
System.out.println("toString:");
System.out.println(e.toString());
System.out.println("printStackTrace:");
e.printStackTrace();
System.out.println("cause:");
System.out.println(e.getCause());
}
}
结果
1:e.getMessage:
我的异常
2:toString:
com.suyan.sca.MopFacadeTest$MyException: 我的异常
3:printStackTrace:
com.suyan.sca.MopFacadeTest$MyException: 我的异常
at com.suyan.sca.MopFacadeTest.f2(MopFacadeTest.java:56)
at com.suyan.sca.MopFacadeTest.main(MopFacadeTest.java:62)
4:cause:
null
情况3:配置cause
static class MyException extends RuntimeException{
MyException(String message){super(message);}
MyException(String message,Throwable e){super(message,e);}
}
public static void f1(){
throw new RuntimeException("myMessage");
}
public static void f2(){
try{
f1();
}catch (RuntimeException e) {
throw new MyException("我的异常",e);
}
}
public static void main(String[] args) {
try{
f2();
}catch (Exception e){
System.out.println("1:e.getMessage:");
System.out.println(e.getMessage());
System.out.println("2:toString:");
System.out.println(e.toString());
System.out.println("3:printStackTrace:");
e.printStackTrace();
System.out.println("4:cause:");
Throwable cause = e.getCause();
System.out.println("4.1:getMessage:");
System.out.println(cause.getMessage());
System.out.println("4.2:toString:");
System.out.println(cause.toString());
System.out.println("4.3:printStackTrace:");
cause.printStackTrace();
}
}
结果
1:e.getMessage:
我的异常
2:toString:
com.suyan.sca.MopFacadeTest$MyException: 我的异常
3:printStackTrace:
com.suyan.sca.MopFacadeTest$MyException: 我的异常
at com.suyan.sca.MopFacadeTest.f2(MopFacadeTest.java:57)
at com.suyan.sca.MopFacadeTest.main(MopFacadeTest.java:63)
Caused by: java.lang.RuntimeException: myMessage
at com.suyan.sca.MopFacadeTest.f1(MopFacadeTest.java:51)
at com.suyan.sca.MopFacadeTest.f2(MopFacadeTest.java:55)
... 1 more
4:cause:
4.1:getMessage:
myMessage
4.2:toString:
java.lang.RuntimeException: myMessage
4.3:printStackTrace:
java.lang.RuntimeException: myMessage
at com.suyan.sca.MopFacadeTest.f1(MopFacadeTest.java:51)
at com.suyan.sca.MopFacadeTest.f2(MopFacadeTest.java:55)
at com.suyan.sca.MopFacadeTest.main(MopFacadeTest.java:63)
附录:
https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html