【打印空指针异常信息getMessage为null】
作者:互联网
某次解析数据进业务表时数据异常,查询接口表想查看错误消息结果发现字段均为空,由于接口表其余字段均回写正常,推测应该是捕获异常信息来返回错误消息字段这部分出了问题。
写了测试方法如下:
@Test public void returnErrorMessage(){ try { User user = null; List<User> userList = new ArrayList<>(); // 模拟数组越界 userList.get(0); /* if(user.getId()!= 0){ System.out.println("异常测试"); }*/ } catch (Exception e) { System.out.println("测试直接getMessage是否能打印异常: "+e.getMessage()); System.out.println("==分割线=="); StringWriter stringWriter= new StringWriter(); PrintWriter writer= new PrintWriter(stringWriter); e.printStackTrace(writer); StringBuffer buffer= stringWriter.getBuffer(); // 截取前200长度的报错信息 String error = buffer.toString().substring(0, 200); System.out.println("测试Buffer能否打印异常 "+error); // printStackTrace()是指将异常本身和异常信息输出到标准的错误流 System.out.println("e.printStackTrace: "); e.printStackTrace(); } }
控制台输出:
测试直接getMessage是否能打印异常: Index: 0, Size: 0 ==分割线== 测试Buffer能否打印异常 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) at com.wang.dao.UserDaoTest.returnErro e.printStackTrace: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) at com.wang.dao.UserDaoTest.returnErrorMessage(UserDaoTest.java:1625) 下略............. Process finished with exit code 0
如果 换成 空指针测试:
try { User user = null; List<User> userList = new ArrayList<>(); // userList.get(0); if(user.getId()!= 0){ System.out.println("异常测试"); } } catch (Exception e) {同上}
控制台输出:
测试直接getMessage是否能打印异常: null ==分割线== 测试Buffer能否打印异常 java.lang.NullPointerException at com.wang.dao.UserDaoTest.returnErrorMessage(UserDaoTest.java:1627) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAcc e.printStackTrace: java.lang.NullPointerException at com.wang.dao.UserDaoTest.returnErrorMessage(UserDaoTest.java:1627) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
发现getMessage无法会的返回信息,debug模式下可以看到:
空指针捕获:
数组越界捕获:
点击getMessage,在源码里发现Throwable 方法有多个,通过断点可以发现 ,二者差别就在于一个toString()方法,cause为空可能导致 返回结果为null
总结:对于空指针异常可能会出现这种getMessage返回值为null的情况,可以使用
e.printStackTrace 打印信息,可以利用StringBuffer.toString()转为字符串存储,具体代码见最上
标签:java,ArrayList,UserDaoTest,printStackTrace,getMessage,null,异常,指针 来源: https://www.cnblogs.com/dabuliu/p/16352805.html