2014-02-27 46 views
13

我正在使用Apache Axis,并且我得到类型(0)null的例外。这里是部分堆栈跟踪:什么类型的异常是(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; 
.... 
+8

哇。这真是一个非常奇怪的错误。有时间查看HTTPSender的代码... –

+1

您能澄清一下这是1.4还是1.4.1?后者是在前者6个月后发布的。 (早在2008年,如果可能,我会敦促升级:) –

+0

Aagh,Axis,而不是Axis2。对不起,我的错误...所以2006年,不是2008年:) –

回答

8

所以异常是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 if块得到执行,因为返回的代码是0(因为rcnull)。它终于登陆在else区块,它在那里产生AxisFault异常。

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

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

tl;博士;可能存在某种网络/读取错误。

+1

感谢您的详细解释。欣赏它。 – riship89

相关问题