一、获取异常对象的两个重要方法
1、getMessage
获取异常简单的描述信息。
语法格式:String msg = exception.getMessage();
2、printStackTrace()
打印异常追踪的堆栈信息,比较适合于程序的调试阶段
语法格式:exception.printStackTrace();
3、两个方法的实例
public class ExceptionText3 {
public static void main(String[] args) {
//这里只是为了测试getMessage()方法和printStackTrace()方法
//这里只是new了异常对象,但是没有将异常对象抛出。JVM会认为这是一个普通的java对象。
NullPointerException e = new NullPointerException("空指针异常Exception ");
//获取异常简单描述信息:这个信息实际上就是构造方法上面String参数
String msg = e.getMessage();//空指针异常Exception
System.out.println(msg);
//打印异常堆栈信息
//java后台打印异常堆栈追踪信息的时候,采用了异步线程的方式打印的。
e.printStackTrace();
System.out.println("Hello World!");
}
}
二、查看异常的追踪信息
我们应该怎么看,可以快速的调试程序呢?
异常信息追踪信息,从上往下一行一行看。
但是需要注意的是:SUN写的代码就不用看了。主要问题是出现在自己编写的代码上。
即从运行结果中的at ExceptionText3.m3(ExceptionText3.java:27)
这一行看
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ExceptionText3 {
public static void main(String[] args) {
try {
m1();
} catch (FileNotFoundException e) {
//打印异常堆栈追踪信息
//在实际开发中建议使用这个。养成好习惯
e.printStackTrace();
}
//这里程序不耽误执行,很健壮
System.out.println("Hello World!");
}
private static void m1() throws FileNotFoundException {
m2();
}
private static void m2() throws FileNotFoundException {
m3();
}
private static void m3() throws FileNotFoundException {
new FileInputStream("C:\\Users\\Administrator\\Desktop\\学习a.txt");
}
}
因为27行出现了问题导致23行
23行出问题导致19行
19行出问题导致7行
应该先查看27行的的代码。27行是错误的根源,从根上看问题
防止误导再加一条!!!!:
尽量不要使用e.printStackTrace(),而是使用log打印。
反例:
try{
// do what you want
}catch(Exception e){
e.printStackTrace();
}
正例:
try{
// do what you want
}catch(Exception e){
log.info("你的程序有异常啦,{}",e);
}
理由:
- printStackTrace()打印出的堆栈日志跟业务代码日志是交错混合在一起的,通常排查异常日志不太方便。
- e.printStackTrace()语句产生的字符串记录的是堆栈信息,如果信息太长太多,字符串常量池所在的内存块没有空间了,即内存满了,那么,用户的请求就卡住啦~