Ошибка на компьютере клиента - PullRequest
1 голос
/ 11 мая 2011

У меня есть программа клиент-сервер java, которая отлично работает на полдюжине компьютеров, но вызывает исключение NegativeArraySizeException на сайте.

Это код

location = message.indexOf("last");
location += 5;
end = message.indexOf('&', location);
int size = end - location;  THIS IS THE ERROR LINE
char[] lastC = new char[size];
message.getChars(location, location+size, lastC, 0);
String firstS = new String(firstC);
String lastS = new String(lastC);

сообщение - это сообщение xml, которое я читаю. location - это целое число, которое указывает на местоположение символа в сообщении, в данном случае это имя. размер - длина имени человека.

Насколько я могу судить, размер задается как отрицательное число, и я не знаю, почему.

Кто-нибудь знает, как это исправить, или лучше было найти длину имени?

Это часть серверной части.

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

Насколько я могу судить, размер задается как отрицательное число, и я не знаю, почему.

Если при первом вызове indexOf невозможно найти "last" в сообщении, для местоположения будет установлено значение -1, а затем увеличено на 5, чтобы получить 4.

Если при втором вызове indexOf невозможно найти '&', тогда end будет установлен на -1, а size будет отрицательным.

Очевидно, что входной XML не соответствует ожидаемой вами форме.

В общем, этот код довольно хитрый. Как минимум, вы должны проверить результаты обоих вызовов на indexOf и предпринять соответствующие шаги по сообщению об ошибках / восстановлению, если они -1.

Но реальное исправление состоит в том, чтобы не пытаться "анализировать" XML с использованием жесткой разбивки строк. Используйте синтаксический анализатор XML, предпочтительно с проверкой на соответствие соответствующей схеме или DTD. Если синтаксический анализатор XML отклоняет ввод, сообщите об ошибке обратно тому, кто / что дал вам сломанный XML.

2 голосов
/ 11 мая 2011

Содержит ли сообщение last вообще? Если нет, location будет отрицательным, и вам следует немедленно прекратить обработку. Эта ошибка может остаться незамеченной, потому что после этого вы добавляете 5 к location, что делает его равным как минимум 4, даже если last отсутствует в строке (спасибо SJuan76 ).

Даже если сообщение содержит last, гарантируется ли, что за ним следует хотя бы один дополнительный символ? Если нет, то добавление 5 к location наверняка укажет за пределы строки.

Более того, end также может быть отрицательным, если в строке после location нет &. Вы должны как-то это обработать (то есть, установив end в этом случае длину сообщения).

Кроме того, если message является строкой, вы можете просто извлечь ее подстроку с помощью метода substring, без необходимости использования getChars magic.

Возможно, лучшим решением было бы что-то вроде этого (я предполагаю, что message - это что-то вроде URL, и вы ищете часть между last> и следующим &, основываясь на вашем комментарии для одного из других ответов):

location = message.indexOf("last>");
if (location >= 0) {
    String lastS;

    location += 5;
    end = message.indexOf('&', location);
    if (end == -1) {
        // Handle the case when there is no "&" after "last>" in the message
    } else {
        lastS = message.substring(location, end);
    }
} else {
    // Handle the case when there is no "last>" in the message
}
1 голос
/ 11 мая 2011

Беда в том, что конец меньше локации. Вопрос в том, какое сообщение вы ожидаете и какое вы получаете; остальная логика работает для определенных сообщений. Проверьте, откуда вы получаете сообщение Строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...