【问题标题】:Exception message is null?异常消息为空?
【发布时间】:2012-01-26 15:46:29
【问题描述】:

我的代码中有 try-catch 语句。在我的 catch 块中,我正在调用 e.getMessage() 来打印异常消息。但是,e.getMessage 不断返回空值。有趣的是,当我调用 e.printStackTrace, 时,打印堆栈跟踪没有问题。

下面是我的代码:

try
{
    console = new BufferedReader(new InputStreamReader(httpsURLConnection.getInputStream()));
}catch(Exception e)
{
    Log.d("Error", "Error Message: " + e.getMessage()); //e.getMessage is returning a null value
    e.printStackTrace(); //this works. is displaying a SocketTimeOutException
}

我的问题可能是什么原因造成的?我该如何解决?

【问题讨论】:

  • 有什么问题?堆栈跟踪和异常消息是两个不同的东西,所以这里没有什么要解决的恕我直言
  • @kostja:他们不相关吗?我以为异常消息是对堆栈跟踪的简要描述?那么如果stacktrace不为null,那么异常消息一定也包含一个值吗?
  • 添加了一个答案,因为它对 cme​​ts 来说太长了

标签: java android exception exception-handling


【解决方案1】:

我认为您的代码中抛出的异常没有任何消息。字符串为空。但当然你可以打印堆栈跟踪。这是两个不同的东西。您将看到堆栈跟踪,但没有消息。

【讨论】:

  • 谢谢。我不知道它们是独立的实体。今天才知道。那么有一些Java没有提供消息的错误呢?
  • 是的,该消息只是可选的。但是我认为让消息为空并不是一个很好的软件设计,因为消息可以帮助用户获取有关错误的更详细信息。
【解决方案2】:

消息和堆栈跟踪是两条不同的信息。虽然 stackstrace 是强制性的,但消息不是。大多数异常都带有消息,这是最好的做法,但有些异常没有,也没有什么可修复的。

您可以让您的客户更轻松,并通过包装无消息异常或以原始异常作为原因抛出自定义异常来提供消息。这可能如下所示。

throw new  MyRuntimeException("Socket was closed unexpectedly", e);

【讨论】:

  • 感谢您的解释。我应该早点学的。
【解决方案3】:

尝试将异常本身提供给记录器而不是 e.getMessage()。记录器通常具有期望 Throwable 对象和记录器的默认配置(通常)打印堆栈跟踪的方法。

【讨论】:

  • @JB Nizet 给出了我的建议的例子。
【解决方案4】:

e.printstacktrace() 表示几乎总是存在的实际堆栈跟踪。一条消息,但不是。如果您查看getMessage() 方法的Javadoc,您会注意到它可能返回null。如果您使用字符串消息参数Exception Javadoc从异常调用构造函数,将会有消息

【讨论】:

  • 谢谢!因此,即使异常是由 Java/Android 本身引发的(不是通过 throw new Exception),异常消息也可能为 null?我调用 e.getMessage() 是因为我想向用户显示错误消息。
  • 如果你被允许在没有消息的情况下抛出异常,那么 Android 也是如此。异常消息是针对开发人员的,而不是针对用户的。 Android代码是Java代码。您应该捕获异常,并自己向用户显示适当的错误消息。
  • @JB Nizet:是的。这就是为什么我还必须通过它的消息知道异常的原因。我的计划是做这样的事情:[if (e.getMessage().contains("Connection Timed Out") then display "Connection Timed Out"]。如果我无法确定异常的主要原因,那么我也无法为用户显示特定的错误消息。
  • 异常的类型和抛出的位置应该足以显示有意义的错误消息。您不应该依赖异常消息。
【解决方案5】:

SocketTimeOutException 是异常的类型。可能只是这个异常(或抛出它的代码)没有费心提供带有异常的消息,并且认为异常的类型足够有意义。使用

Log.d("Error", "Error Message: " + e);

Log.d("Error", "Some exception occurred", e);

而不是询问消息。

【讨论】:

  • 谢谢!但是如何知道 SocketTimeOutException 是由于连接超时还是其他原因?
  • A SocketTimeoutException “表示套接字读取或接受发生超时。”。这就是 javadoc 所说的。
  • 谢谢!那么捕获 SocketTimeOutException 会更好吗?我只是害怕,因为就像在 ConnectException 中一样,有很多情况可以触发它。如果我必须向用户显示一个非常具体的错误消息,那么我还必须检查异常消息。不只是 Exception 的名称而已。
  • 场景不多:“socket read or accept 发生超时”。您应该知道您是在进行套接字读取还是接受。所以你确切地知道发生了什么以及发生在哪里。
猜你喜欢
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2017-04-29
  • 2018-10-29
  • 2021-03-19
相关资源
最近更新 更多