其他分享
首页 > 其他分享> > 【打印空指针异常信息getMessage为null】

【打印空指针异常信息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