2011-03-15 3 views
0

Je travaille sur une page JSP, mais je cours dans un pointeur nul au moment de l'exécution. Dans une tentative d'isoler le problème, j'ai codé en dur la réponse de la variable attendue au lieu d'utiliser un getter (il était précédemment action.getName(psi.getLong()))). Effectivement, j'ai eu une erreur quand j'ai essayé de courir la page avec le long cru.Pourquoi mes longs deviendront-ils des ints?

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 est défini ailleurs comme suit

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

Mais à en juger par ce qui précède, je suppose que le 9.000.000.000 est même pas se passé jusque-là. Est-ce que .JSP ne peut pas gérer les longs?

En outre, cette erreur peut-elle avoir causé l'erreur nullpointer que je rencontrais lors de l'exécution, ou est-ce une erreur complètement distincte? (C'est tout ce que le stacktrack dit: NullPointerException: null)

Editer: D'oh. En utilisant une usine, j'ai oublié d'instancier l'un des DAO que j'utilise. Ce serait la cause du NullPointer alors. Affaire classée.

+1

Essayez suff ixing votre long numéro avec L comme 'long number = 900L;' – asgs

+0

pouvez-vous poster NPE stacktrace? –

+0

@Jigar - Je l'ai déjà réparé. Il me dit cependant que j'ai besoin de caféine ou de sommeil; de préférence ce dernier. –

Répondre

2

Essayez d'utiliser

9000000000L.

Vous devez spécifier le type dans ce cas. Ou utilisez

new Long("9000000000")

+3

'new Long (9000000000)' ne fonctionnera pas, car '9000000000' sera toujours interprété comme un' int'. –

+0

Merci pour la correction, j'ai raté le "" ... – Winfred

3

changement long sarah = 9000000000;-long sarah = 9000000000L;. Sans le suffixe «L», tout littéral entier est un int en Java.

+0

Le compilateur ne fait pas que "supposer" cela ... –

+0

@Stephen C: Je suppose que vous seriez d'accord si je changeais cela en "considère"? – MAK

+0

Trier par. Le vrai problème est que JLS dit qu'un littéral entier sans suffixe est un littéral 'int'. Le compilateur est juste un morceau de logiciel qui implémente le JLS ... il n'a aucune "vue" sur le sujet. –

0

Pour comprendre ce qui se passe ici, vous devez comprendre un peu les littéraux entiers.

En Java, il existe deux types de littéraux entiers.

  • Un long littéral a un suffixe 'L' et doit être comprise dans la plage -2^63 à + 2^63 - 1. Il est de type long. Un littéral Int n'a pas de suffixe et doit être compris entre -2^31 et + 2^31 - 1. Il a le type int.

Un littéral entier qui tombe en dehors de la plage prescrite est une erreur de compilation, quel que soit le contexte. Ainsi:

long sarah = 9000000000; 

est une erreur de compilation, en dépit du fait que ce "nombre" est compatible avec le type sur le LHS. De même:

Long fred = new Long(9000000000); 

est une erreur de compilation ... pour la même raison.

La solution consiste à ajouter un suffixe L; par exemple.

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

(En fait, je dit un petit mensonge blanc dans ce qui précède. Le JLS fait indique qu'un littéral entier est non signé, et que ce qui ressemble à un est en fait une expression « littérale négative » en utilisant l'opérateur Unary moins Les valeurs littérales entières légales sont donc de 0 à + 2^31 - 1 (pour int) et de 0 à + 2^63 - 1 (pour long) Les littéraux 2^31 et 2^63 ex. Integer.MIN_VALUE et Long.MIN_VALUE sont des cas spéciaux ... ils sont seulement légal lorsque précédé par Unaire moins.)