博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java报异常时getMessage()方法返回null
阅读量:5131 次
发布时间:2019-06-13

本文共 2677 字,大约阅读时间需要 8 分钟。

有次在查看项目日志的时候发现getMessage()返回值是null,以为是代码写的有问题,后来发现空指针异常时返回值就是null,虽然问题原因找到,但是感觉在日志中单单输出null对我们查看日志不够友好,想找到一种更好的方式。

原因

翻阅了API后发现getMessage()是Throwable类提供的方法

getMessage

public  getMessage()

Returns the detail message string of this throwable.

Returns:

the detail message string of this Throwable instance (which may be null).

 翻译过来的意思大概是:返回当前抛出的Trowable实例的详细信息(可能会是null)

从API中的说明可以得知,我们getMessage()得到的是null也不足为奇了,博主常遇见的null情况是空指针异常,具体是否还有其他的异常情况会得到null的也还不太清楚,看了其他博主的文章发现是会有其他异常也返回null的情况。

那么是否有更好的办法可以让我们知道输出错误是什么呢,答案是肯定的,在经过一番查找后发现有以下两种更好的方式:

  • 使用Exception的printStackTrace()方法
  • 使用Exception的toString()方法

区别

对比出现空指针异常时的区别

printStackTrace

当出现空指针异常时,会输出异常类型和异常代码所在的行数,在我们的代码量多起来以后,会出现一个类调用另一个类,报异常时会将每个报错的行都输出,当调用关系复杂起来的时候会输出一长串内容。

// 没有其他类调用时

java.lang.NullPointerException

    at com.test.HelloWorld.main(HelloWorld.java:12)

// 其他类或方法调用时

java.lang.NullPointerException
    at com.test.HelloWorld.test(HelloWorld.java:11)
    at com.test.SecondTest.main(SecondTest.java:6)

toString

查看了jdk的源码后发现NullPointerException本身没有实现toString()函数,而是通过继承使用Throwable的toString()函数,该函数会先获取detailMessage的值(出现空指针异常时Throwable类的detailMessage为null,因此直接调用getMessage()方法会返回null),如果为空返回当前异常类名,否则返回detailMessage,所以即使是空指针异常也会返回java.lang.NullPointerException

/** * Returns a short description of this throwable. * The result is the concatenation of: * 
    *
  • the {
    @linkplain Class#getName() name} of the class of this object *
  • ": " (a colon and a space) *
  • the result of invoking this object's {
    @link #getLocalizedMessage} * method *
* If {
@code getLocalizedMessage} returns {
@code null}, then just * the class name is returned. * * @return a string representation of this throwable. */public String toString() { String s = getClass().getName(); String message = getLocalizedMessage(); return (message != null) ? (s + ": " + message) : s;}/** * Creates a localized description of this throwable. * Subclasses may override this method in order to produce a * locale-specific message. For subclasses that do not override this * method, the default implementation returns the same result as * {
@code getMessage()}. * * @return The localized description of this throwable. * @since JDK1.1 */public String getLocalizedMessage() { return getMessage();}/** * Returns the detail message string of this throwable. * * @return the detail message string of this {
@code Throwable} instance * (which may be {
@code null}). */public String getMessage() { return detailMessage;}

结论

仅需要知道返回的异常类型时使用Exception的toString()方法,需要知道报错详情则使用Exception的printStackTrace()方法。

才疏学浅,如文中有错误,感谢大家指出。

转载于:https://www.cnblogs.com/runningRookie/p/11109728.html

你可能感兴趣的文章
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
[HDU3683 Gomoku]
查看>>
下一代操作系统与软件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Python IO模型
查看>>
DataGridView的行的字体颜色变化
查看>>
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Android-多线程AsyncTask
查看>>
LeetCode【709. 转换成小写字母】
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>