2011-08-17 32 views
68

Estoy trabajando con tipos de datos en este momento en Java, y si lo he entendido correctamente, el tipo long acepta un valor entre los rangos de: -9,223,372,036,854 a +9,223,372,036,854,775,807. Ahora bien, como se puede ver a continuación Tengo crear una variable de largo llamada testLong, aunque cuando inserto 9223372036854775807 como el valor, me sale un error que dice:El xyz literal del tipo int está fuera del rango

"El literal 9223372036854775807 del tipo int es fuera de alcance".

No sé por qué se está refiriendo al tipo de datos como un long Cualquier persona int

tiene alguna idea?

siguiente código:

char testChar = 01; 
byte testByte = -128; 
int testInt = -2147483648; 
short testShort = -32768; 
long testLong = 9223372036854775807; 
float testFoat; 
double testDouble = 4.940656458412; 
boolean testBool = true; 
+0

Por cierto: ¿qué compilador estás usando? Tanto Eclipse como el compilador Sun JDK dan diferentes (en mi opinión, mejor) mensaje de error para este problema. –

Respuesta

151

Añadir mayúscula L hasta el final:

long value = 9223372036854775807L; 

De lo contrario, el compilador tratará de analizar el literal como int, por lo tanto, el mensaje de error

+0

Gracias, ¿por qué es esto necesario? –

+3

Está en las especificaciones del lenguaje Java. Encontrar el texto completo [aquí] (http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html) –

11

Intenta hacer 9223372036854775807L

+0

grande. ! gracias rock! – ralphgabb

38

No sé por qué se está refiriendo al tipo de datos siempre que un int

no lo es. Debes aprender a confiar en los mensajes del compilador (especialmente cuando proceden de compiladores modernos y no antiguos compiladores C/C++). Si bien el idioma que hablan puede ser difícil de descifrar a veces, por lo general no te mienten.

Veamos de nuevo:

El literal de int 9223372036854775807 está fuera del intervalo.

Nota, que no mencionar la variable de testLong o el tipo long en cualquier lugar, por lo que es no acerca de la inicialización. El problema parece ocurrir en algún otro punto.

Ahora vamos a investigar algunas de las partes del mensaje: (que no es lo que quería)

  • int nos dice que quiere tratar algo como un valor int
  • "fuera de rango "es bastante claro: algo no está dentro del rango esperado (probablemente el de int)
  • " The literal ": ahora eso es interesante: ¿qué es un literal?

Dejaré la lista para hablar de literales por un momento: los literales son lugares donde tiene algún valor en su código. Hay literales String, literales int, literales class y así sucesivamente.Cada vez que se menciona un valor explícitamente en el código, que es un literal.

así que no es en realidad le persistentes acerca de la declaración de variables, pero el número en sí, el valor es lo que le está insistiendo que quería.

usted puede fácilmente verificar esto usando la misma literal en un contexto donde un long y un int son igualmente aceptables:

System.out.println(9223372036854775807); 

PrintStream.println puede tomar cualquiera an int o a long (o casi cualquier otra cosa). Entonces ese código debería estar bien, ¿verdad?

No. Bueno, tal vez debería ser, pero de acuerdo con las reglas que es no está bien.

El problema es that "some digits" is defined to be an int literal y por lo tanto debe estar en el intervalo definido por int.

Si desea escribir un long literal, entonces usted debe hacer que explícita añadiendo el L (o minúsculas l, pero altamente sugiere utilizar siempre la variante en mayúsculas, porque es mucho más fácil de leer y más difícil de confundir con un 1).

Tenga en cuenta que un problema similar se produce con float (postfix F/f) y double (postfix D/d).

nota

lateral: se dará cuenta de que no hay byte o short literales y todavía se puede asignar valores (generalmente int literales) a byte y short variables: eso es posible debido a las reglas especiales en § 5.2 about Assignment Converson: permiten la asignación de la constante expresiones de un tipo más grande a byte, short, char o intsi los valores están dentro del rango de tipos.

+3

¿Dónde se toma el tiempo de ;-) –

+3

@Lukas: de vez en cuando escribir tales respuestas con la esperanza de que no voy a tener que escribir 300 más cortas para ello ;-) También: ayudar a interpretar el mensaje de error (con suerte) significa menos preguntas "¿qué significa ese mensaje de error? –

+0

su respuesta es muy bueno ... sin duda, es por eso por voto, pero por favor, editar y en la parte superior (comienzo de su respuesta), acaba de escribir en 1 línea de la solución exacta del problema, y ​​luego por debajo de su explicación. Porque mucha gente busca una solución rápida en lugar de una explicación profunda –

0

he tenido este problema en el pasado y me fijo que al escribir el valor en forma científica. por ejemplo:

double val = 9e300; 
Cuestiones relacionadas