Почему мои длинные превращаются в целые? - PullRequest
0 голосов
/ 15 марта 2011

Я работаю над страницей JSP, но во время выполнения я сталкиваюсь с нулевым указателем. В попытке изолировать проблему, я жестко закодировал ожидаемый ответ переменной вместо использования геттера (это было ранее action.getName(psi.getLong()) )). Конечно же, я получил ошибку, когда попытался запустить страницу с сырым длинным.

An error occurred at line: 70 in the jsp file: /auth/foo/viewBar.jsp
The literal 9000000000 of type int is out of range 

70:             <%long sarah = 9000000000; %>
71:             <td> <%= StringEscapeUtils.escapeHtml(""+action.getName(sarah)) %></td>

getName определяется в другом месте следующим образом

public String getName(long mid) throws DBException {
        try {
            return personnelDAO.getName(mid);
        } catch (fooException e) {
            e.printStackTrace();
            return "exception retrieving name";
        }

Но, судя по вышесказанному, я предполагаю, что 9000000000 даже не проходит так далеко. Может ли .JSP не обрабатывать длинные?

Кроме того, могла ли эта ошибка вызвать ошибку нулевого указателя, с которой я столкнулся во время выполнения, или это совершенно отдельная ошибка? (Это все, что написано в стеке: NullPointerException: null)

Редактировать: Д'Ох. Используя фабрику, забыл создать экземпляр одного из DAO, которые я использую. Это было бы причиной NullPointer тогда. Дело закрыто.

Ответы [ 3 ]

3 голосов
/ 15 марта 2011

Измените long sarah = 9000000000; на long sarah = 9000000000L;.Без суффикса 'L' любой целочисленный литерал в Java является int.

2 голосов
/ 15 марта 2011

Попробуйте использовать

9000000000L.

Вам необходимо указать тип в этом случае. Или используйте

new Long("9000000000")

0 голосов
/ 15 марта 2011

Чтобы понять, что здесь происходит, вам нужно немного понять целочисленные литералы.

В Java существует два вида целочисленных литералов.

  • AДлинный литерал имеет суффикс «L» и должен находиться в диапазоне от -2 ^ 63 до + 2 ^ 63 - 1. Он имеет тип long.

  • Литерал Int имеетбез суффикса и должен находиться в диапазоне от -2 ^ 31 до + 2 ^ 31 - 1. Он имеет тип int.

Целочисленный литерал, выходящий за пределы предписанного диапазонаэто ошибка компиляции, независимо от контекста.Таким образом:

long sarah = 9000000000;

является ошибкой компиляции, несмотря на то, что это «число» совместимо с типом на LHS.Аналогично:

Long fred = new Long(9000000000);

- ошибка компиляции ... по той же причине.

Решение состоит в том, чтобы добавить суффикс L;например,

long sarah = 9000000000L;
Long fred = new Long(9000000000L);

(На самом деле, я сказал маленькую белую ложь в приведенном выше. JLS на самом деле утверждает, что целочисленный литерал не подписан, и что то, что выглядит как "«отрицательный литерал» на самом деле является выражением, использующим унарный оператор минус. Следовательно, допустимые целочисленные литеральные значения составляют от 0 до + 2 ^ 31 - 1 (для целых) и от 0 до + 2 ^ 63 - 1 (для длинных). Литералы 2 ^31 и 2 ^ 63, используемые для выражения Integer.MIN_VALUE и Long.MIN_VALUE являются особыми случаями ... они только допустимы, когда им предшествует унарный минус.)

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