2014-02-27 83 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

相關問題