我正在使用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;
....
最佳答案
因此,异常(exception)是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
(因为else if
为0
),因此rc
块和null
块均不会执行。最终它落在else
块中,在其中生成AxisFault
异常。您会注意到
statusMessage
本身就是null
。我看到它设置此属性的唯一地方是line 641方法,即line 581。无法设置状态消息和返回码的唯一方法是,如果它们已经是
readHeadersFromSocket
,或者该方法中的较早版本存在错误,这将导致控制脱离以line 585开始的null
循环。尤其值得关注的是line 598和ojit_a,这两个都是for
语句,如果它们的测试条件为true,它们将在循环外将if
删除。这些语句中的一个检查break
的值是否为inp.read()
(这意味着已到达流的末尾),另一个语句检查所读内容的长度是否为-1
。如果发生网络错误(即,没有从套接字读取任何内容)或服务器未返回任何内容(零长度数据),则这些条件可以成立。因此,如果这些条件中的任何一个成立,控制就会中断。最终,由于无法获取返回码,因此0
将引发异常。但是因为失败发生在它甚至没有设置错误消息之前,您就收到了readFromSocket
错误消息。tl;博士可能存在某种网络/读取错误。