Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常消息为空?_Java_Android_Exception_Exception Handling - Fatal编程技术网

Java 异常消息为空?

Java 异常消息为空?,java,android,exception,exception-handling,Java,Android,Exception,Exception Handling,我的代码中有一个try-catch语句。在catch块中,我调用e.getMessage()打印异常消息。但是,e.getMessage始终返回空值。有趣的是,当我调用e.printStackTrace时,打印堆栈跟踪没有问题 下面是我的代码: try { console = new BufferedReader(new InputStreamReader(httpsURLConnection.getInputStream())); }catch(Exception e) { L

我的代码中有一个
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
}

我的问题的原因是什么?如何解决它?

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

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


而不是询问消息。

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

e.printstacktrace()表示几乎始终存在的实际堆栈跟踪。然而,这不是一条信息。如果您检查该方法的Javadoc,您会注意到它可能返回null。如果您使用字符串message param从异常调用构造函数,将出现一条消息,请尝试将异常本身提供给记录器,而不是e.getMessage()。日志记录者通常具有期望可丢弃对象的方法,并且日志记录者的默认配置(通常)打印堆栈跟踪。

消息和堆栈跟踪是两条不同的信息。虽然stackstrace是必需的,但消息不是必需的。大多数异常都会传递一个信息,这是最好的做法,但有些例外就是不传递信息,也没有什么可以解决的

不过,您可以通过包装无消息异常或以原始异常作为原因引发自定义异常来简化您的客户机,并提供消息。这可能如下所示

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

有什么问题?stacktrace和异常消息是两个不同的东西,所以这里没有什么需要解决的IMHO@kostja:他们没有关系吗?我认为异常消息是stacktrace的简要描述?因此,如果stacktrace不是null,那么异常消息也必须包含一个值?添加了一个答案,因为它对于CommentsHanks来说太长了!因此,即使异常是由Java/Android本身引发的(而不是通过抛出新异常),异常消息也可能为null?我之所以调用e.getMessage(),是因为我想向用户显示错误消息。如果允许您在没有消息的情况下抛出异常,Android也是如此。异常消息是针对开发人员的,而不是针对用户的。Android代码是Java代码。您应该捕获异常,并亲自向用户显示相应的错误消息。@JB Nizet:Yes。这就是为什么我还必须通过它的消息知道异常的原因。我的计划是这样做:[如果(e.getMessage().contains)(“连接超时”),则显示“连接超时”]。如果我无法确定异常的主要原因,那么我也无法为用户显示特定的错误消息。异常的类型和引发位置应该足以显示有意义的错误消息。您不应该依赖异常消息。谢谢!但我该如何知道如果SocketTimeOutException是由于连接超时或其他原因导致的?SocketTimeOutException“表示套接字读取或接受发生超时。”。这就是javadoc所说的。谢谢!那么,捕获SocketTimeOutException是否更好?我只是担心,因为就像在ConnectException中一样,有很多场景可能会触发它。如果我必须向用户显示一条真正特定的错误消息,那么我还必须检查异常消息。不仅仅是Ex的名称只有异常。没有很多场景:“套接字读取或接受时发生超时”。您应该知道您是在执行套接字读取还是接受。这样您就可以确切地知道发生了什么以及发生了什么。谢谢。我不知道它们是独立的实体。今天才了解到。所以有一些错误是Java没有提供消息吗?是的,消息只是可选的。但我认为让消息通过软件设计不是很好null,因为该消息帮助用户获得有关错误的更详细信息。感谢您的解释。我应该早点了解它。@JB Nizet给出了我建议的示例。
throw new  MyRuntimeException("Socket was closed unexpectedly", e);