【问题标题】:What type of exception is (0)null?(0)null 是什么类型的异常?
【发布时间】:2014-02-27 23:56:37
【问题描述】:

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

【问题讨论】:

  • 哇。这真是一个奇怪的错误。是时候看看 HTTPSender 的代码了...
  • 你能澄清一下这是1.4还是1.4.1?后者仅在前者之后 6 个月发布。 (早在 2008 年......如果可能的话,我会敦促升级 :)
  • 啊,轴,不是轴 2。对不起,我的错误......所以是 2006 年,而不是 2008 年 :)
  • Lines 685-689 似乎很有希望。没有为整数分配任何值,因此结合未定义的错误消息,这应该返回(0)null

标签: java exception axis


【解决方案1】:

所以例外是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或者如果之前在方法,这会导致控制脱离从line 581 开始的for 循环。特别感兴趣的是line 585line 598,它们都是if 语句,如果它们的测试条件为真,它们将break 退出循环。其中一个语句检查inp.read() 的值是否为-1(这意味着已到达流的末尾),另一个检查读入的长度是否为0。如果存在网络错误(即,没有从套接字读取)或服务器没有返回任何内容(零长度数据),则这些条件可以成立。因此,如果这些条件中的任何一个为真,控制就会跳出循环。最终,readFromSocket 将抛出异常,因为它无法获得返回码。但是由于失败发生在它甚至可以设置错误消息之前,您会收到null 错误消息。

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

【讨论】:

  • 感谢您的详细解释。欣赏它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2022-11-29
  • 2023-01-12
相关资源
最近更新 更多