我正在处理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
)
答案 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是特殊情况......当前面是一元减号时,它们仅合法。)