我的代码中有try-catch
语句。在我的catch块中,我调用e.getMessage()
来打印异常消息。但是,e.getMessage
会一直返回null值。有趣的是,当我调用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
}
可能是我的问题的原因是什么?我该如何解决?
答案 0 :(得分:19)
消息和堆栈跟踪是两个不同的信息。虽然stackstrace是必需的,但消息却不是。大多数异常带有一条消息,这是最好的做法,但有些只是没有,而且没有什么可以解决的。
您可以使客户端更容易,并通过包装无消息异常或以原始异常为原因抛出自定义异常来提供消息。这可能如下所示。
throw new MyRuntimeException("Socket was closed unexpectedly", e);
答案 1 :(得分:9)
SocketTimeOutException是异常的类型。可能只是这个异常(或抛出它的代码)没有提供带有异常的消息,并认为异常的类型足够有意义。使用
Log.d("Error", "Error Message: " + e);
或
Log.d("Error", "Some exception occurred", e);
而不是询问消息。
答案 2 :(得分:2)
e.printstacktrace()表示几乎总是存在的实际堆栈跟踪。但是没有消息。如果检查getMessage()方法的Javadoc,您会注意到它可能返回null。如果使用字符串消息参数Exception Javadoc
从异常中调用构造函数,则会出现消息答案 3 :(得分:1)
我认为代码中抛出的异常没有消息。 String为null。但是你当然可以打印堆栈跟踪。这是两件不同的事情。您将看到堆栈跟踪,但没有消息。
答案 4 :(得分:1)
尝试将异常本身提供给记录器而不是e.getMessage()。记录器通常具有期望Throwable对象和记录器的默认配置(通常)打印堆栈跟踪的方法。