什么类型的异常是(0)null?

时间:2014-02-27 23:56:37

标签: java exception axis

我正在使用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;
....

1 个答案:

答案 0 :(得分:9)

因此异常属于AxisFault类型,但看起来statusMessagenullLine 444是:

AxisFault fault = new AxisFault("HTTP", "(" + returnCode + ")" + statusMessage, null, null);

(0)null部分来自"(" + returnCode + ")" + statusMessagestatusMessage本身已在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(因为else if0),rc块并且没有null块被执行。它最终会在else块中出现,它会生成AxisFault异常。

您会注意到statusMessage本身是null。我可以看到它设置此属性的唯一位置是line 641,这是readHeadersFromSocket方法。

状态消息和返回代码不会被设置的唯一方法是,如果它们已经null之前有错误在该方法中,它导致控制突破line 581上开始的for循环。特别感兴趣的是line 585line 598,两者都是if语句,如果它们的测试条件为真,它们将break退出循环。其中一个语句检查inp.read()的值是否为-1(表示已到达流的末尾),另一个检查以查看读入的内容的长度是否为0。如果存在网络错误(即,没有从套接字读取任何内容)或者没有从服务器返回任何内容(零长度数据),则这些条件可以成立。因此,如果这些条件中的任何一个为真,则控制会突然出现。最终,readFromSocket将抛出异常,因为它无法获得返回代码。但是因为失败发生在甚至可能设置错误消息之前,您会收到null错误消息。

<强> TL; dr; 可能存在某种网络/读取错误。