我正在使用 Apache Axis,我收到类型为 (0)null
的异常。这是部分堆栈跟踪:
....
....
org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:281)
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:120)
at java.lang.Thread.run(Thread.java:744)
Caused by: (0)null
at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:744)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at com.netsuite.webservices.platform_2012_1.NetSuiteBindingStub.upsertList(NetSuiteBindingStub.java:11841)
....
....
以下是我在 HTTPSender 源代码中看到的。
....
AxisFault fault = new AxisFault("HTTP", "(" + returnCode + ")" + statusMessage, null, null);
....
throw fault;
....
最佳答案
所以异常是 AxisFault
类型,但看起来 statusMessage
是 null
。 Line 444是:
AxisFault fault = new AxisFault("HTTP", "(" + returnCode + ")" + statusMessage, null, null);
(0)null
部分来自"("+ returnCode + ")"+ statusMessage
。 statusMessage
本身在 line 742 中分配:
String statusMessage = msgContext.getStrProp(HTTPConstants.MC_HTTP_STATUS_MESSAGE);
returnCode
在方法的早期设置为 0
。接下来的几条语句应该将其设置为正确的值:
Integer rc = (Integer) msgContext.getProperty(HTTPConstants.MC_HTTP_STATUS_CODE);
if (rc != null) {
returnCode = rc.intValue();
} else {
// No return code?? Should have one by now.
}
在此之后,if
block 和任何 else if
block 都不会被执行,因为返回码是 0
(因为 rc
为 null
)。它最终出现在 else
block 中,并在其中生成 AxisFault
异常。
您会注意到 statusMessage
本身是 null
。我唯一可以看到它设置此属性的地方是 line 641 ,这是 readHeadersFromSocket
方法。
状态消息和返回码不会设置的唯一方法是如果它们已经是null
,或者如果有一个方法中较早的错误,导致控制跳出开始于 line 581 的 for
循环.特别感兴趣的是 line 585和 line 598 ,这两个都是 if
语句,如果它们的测试条件为真,它们将 break
退出循环。其中一个语句检查 inp.read()
的值是否为 -1
(这意味着已经到达流的末尾),另一个检查查看读入的长度是否为0
。如果存在网络错误(即没有从套接字读取任何内容)或者没有从服务器返回任何内容(零长度数据),这些条件可以成立。因此,如果这些条件中的任何一个为真,控制就会跳出循环。最终,readFromSocket
将抛出异常,因为它无法获得返回码。但是因为失败发生在它甚至可以设置错误消息之前,所以您会收到一条 null
错误消息。
; dr; 可能存在某种网络/读取错误。
关于java - (0)null 是什么类型的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22083362/