前言:
博主早上在地铁上无意点开了个帖子。上面说:
String getMessage()
: 返回异常发生时的详细信息String toString()
: 返回异常发生时的简要描述void printStackTrace()
: 在控制台上打印Throwable
对象封装的异常信息
那我当时就好奇了,好像我们用都是用的 printStackTrace() 。前面的两种方法打印的格式是什么样子的呢?于是博主利用午休时间在公司一顿乱造,最后总结写出了这篇文章。
Throwable类里声明了toString()、getMessage()和printStackTrace()这3个方法。
Exception类是从Throwable类继承的,能直接调用这几个方法。
官方API文档里对这三个方法的定义:
1. public String toString()
Returns a short description of this throwable.
2. public String getMessage()
Returns the detail message string of this throwable.
3. public void printStackTrace()
Prints this throwable and its backtrace to the specified print stream.
对上述定义的个人理解:
1.调用toString()方法:返回该异常类名和字符串信息
(或者直接输出该异常对象结果也是一样,因为实质也是调用toString()方法)
2.调用getMessage()方法:返回字符串信息
3.调用printStackTrace()方法:打印该异常类名、字符串信息和方法调用到异常抛出的轨迹
注:toString()和getMessage()和这2个方法的返回类型是String,是返回信息;而printStackTrace()的返回类型是void,是直接打印出信息
public class ThrowableTest{
public static void main(String[] args){
try{
throw new Exception("This is a Bug");
}catch(Exception e){
System.out.println("0: "+e);
System.out.println("1: "+e.toString());
System.out.println("2: "+e.getMessage());
System.out.print("3: ");
e.printStackTrace();
}
}
}
输出:
0: java.lang.Exception: This is a Bug
1: java.lang.Exception: This is a Bug
2: This is a Bug
3: java.lang.Exception: This is a Bug
如果是自己定义的异常类(继承了Exception),字符串信息要传给其父类Exception的构造器,上述3个方法才能返回该字符串。(除非在自己定义的类中覆盖这几个方法)。
如下程序中的MyException类的字符串信息只传给自己的构造器的,调用方法时无法返回该字符串
而MyException_1类的字符串信息由super()方法传给了Exception的构造器,调用方法时能返回该字符串
class MyException extends Exception{
String s;
MyException(String s1){this.s=s1;}
}
class MyException_1 extends Exception{
MyException_1(String s1){super(s1);}
}
public class Test1{
public static void main(String[] args){
try{
throw new MyException("This is a Bug");
}catch(MyException e){
System.out.println("1: "+e.toString());
System.out.println("2: "+e.getMessage());
System.out.print("3: ");
e.printStackTrace();
}
try{
throw new MyException_1("This is a Bug");
}catch(MyException_1 e){
System.out.println("4: "+e.toString());
System.out.println("5: "+e.getMessage());
System.out.print("6: ");
e.printStackTrace();
}
}
}
输出:
1: MyException
2: null
3: MyException
at ThrowableTest.main(Test1.java:13)
4: MyException_1: This is a Bug
5: This is a Bug
6: MyException_1: This is a Bug
at ThrowableTest.main(Test1.java:21)