为什么我的渴望变成了整体?

时间:2011-03-15 06:36:27

标签: java jsp nullpointerexception

我正在处理JSP页面,但是我在运行时遇到了一个空指针。为了隔离问题,我对预期的变量响应进行了硬编码,而不是使用getter(以前是action.getName(psi.getLong()) ))。果然,当我尝试使用raw long运行页面时出现错误。

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";
        }

但从上述情况来看,我猜想90万甚至没有通过那么远。可以.JSP不处理多头吗?

此外,这个错误是否会导致我在运行时遇到的nullpointer错误,或者这是一个完全独立的错误? (这就是所有的堆栈跟踪说:NullPointerException: null

编辑:D'哦。使用工厂,忘了实例化我正在使用的一个DAO。那就是Nul​​lPointer的原因。案件结案。

3 个答案:

答案 0 :(得分:3)

long sarah = 9000000000;更改为long sarah = 9000000000L;。没有'L'后缀,任何整数文字都是Java中的int

答案 1 :(得分:2)

尝试使用

  

9000000000L。

在这种情况下,您需要指定类型。 或者使用

  

new Long("9000000000")

答案 2 :(得分:0)

要了解这里发生了什么,你需要了解一下整数文字。

在Java中有两种整数文字。

  • Long文字的后缀为“L”,必须落在-2 ^ 63到+ 2 ^ 63 - 1的范围内。它的类型为long

  • Int文字没有后缀,必须落在-2 ^ 31到+ 2 ^ 31 - 1的范围内。它的类型为int

无论上下文如何,超出规定范围的整数文字都是编译错误。因此:

long sarah = 9000000000;

是一个编译错误,尽管该“数字”与LHS上的类型兼容。类似地:

Long fred = new Long(9000000000);

是一个编译错误......出于同样的原因。

解决方案是添加L后缀; e.g。

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

(实际上,我在上面说了一个小小的谎言.JLS 实际上表明Integer文字是无符号的,而看起来像“负文字”的实际上是使用一元减运算符。因此,合法的整数字面值为0到+ 2 ^ 31 - 1(对于int)和0到+ 2 ^ 63 - 1(对于长)。用于表示整数的文字2 ^ 31和2 ^ 63 .MIN_VALUE和Long.MIN_VALUE是特殊情况......当前面是一元减号时,它们合法。)