Подтвердить что ты не робот

Какой тип исключения (0) null?

Я использую 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;
....
4b9b3361

Ответ 1

Таким образом, исключение имеет тип AxisFault, но выглядит как statusMessage is null. Строка 444:

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

Часть (0)null происходит от "(" + returnCode + ")" + statusMessage. statusMessage сам назначается в строке 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. Единственное место, где я могу установить это свойство, - это строка 641, которая является методом readHeadersFromSocket.

Единственный способ, чтобы сообщение статуса и код возврата не были установлены, если они уже null, или если в методе есть более ранняя ошибка, из-за чего управление вырывается из цикла for который начинается с строка 581. Особый интерес представляют строка 585 и строка 598, обе которые являются операторами if, которые break выходят из цикла, если их тестовое условие истинно. Одно из этих утверждений проверяет, соответствует ли значение inp.read() -1 (что означает, что конец потока достигнут), а другой проверяет, соответствует ли длина того, что было прочитано, 0. Эти условия могут сохраняться, если есть сетевая ошибка (т.е. Ничего не читается из сокета) или если ничего не было возвращено с сервера (данные нулевой длины). Поэтому, если какое-либо из этих условий истинно, управление выходит из цикла. В конце концов, readFromSocket выдаст исключение, так как он не смог получить код возврата. Но поскольку произошел сбой, прежде чем он смог даже установить сообщение об ошибке, вы получите сообщение об ошибке null.

TL; dr; Вероятно, есть какая-то ошибка в сети/чтении.