2010-12-09 25 views
17

Tengo el siguiente código:¿Por qué Integer.getInteger no funciona?

game.log.fine("HERE" + bestMove.get("score")); 
Integer bestScore = Integer.getInteger(bestMove.get("score")); 
game.log.fine("THERE" + bestScore); 

Como una salida que tengo:

FINE: HERE50 
Dec 9, 2010 11:34:17 AM game.Agent getCloud 
FINE: THEREnull 
Dec 9, 2010 11:34:17 AM game.Agent getCloud 

Probablemente he tenido que añadir que bestMove es HashMap<String,String>.

El problema es que bestMove.get("score") da un valor de cadena (igual a "50"). Pero si intento transformar a entero, obtengo null.

¿Alguien sabe cuál es el problema aquí?

+0

Integer.parseInteger() en lugar? :) –

+2

Debe seleccionar una respuesta correcta de abajo. –

+0

@Roman: si esto resolvió su pregunta, ¿podría marcar una respuesta como correcta? –

Respuesta

9

Sospecho que usted está buscando el método Integer.parseInt:

analiza el argumento de cadena como un entero decimal con signo.

Ejemplo de uso:

int bestScore = 0; 
try { 
    bestScore = Integer.parseInt(bestMove.get("score")); 
} catch (NumberFormatException nfe) { 
    // handle exception gracefully 
} 

El Integer.getInteger hace algo completamente diferente:

Determina el valor entero de la propiedad del sistema con el nombre especificado.

2

Debe utilizar

Integer.parseInt 

en su código ya

Integer.getInteger 

determinará el valor entero de la propiedad del sistema con el nombre especificado.

código correcto sería:

Integer bestScore = Integer.parseInt(bestMove.get("score"), 10); 

Eso 10 como el segundo argumento es la raíz. Úselo siempre para que su número no se analice ambiguamente.

+0

el segundo argumento para 'parseInt' se puede omitir. – aioobe

+0

@aioobe: cierto, pero lo usaría de todos modos, solo para estar seguro. – darioo

+0

Seguro sobre qué? El valor predeterminado es 10. No van a cambiarlo en nosotros. Y tampoco hay nada ambiguo en eso. – EJP

0

Use Integer.parseInt(String).

32

Porque Integer.getInteger no es lo que está buscando. Desde el Javadoc:

Determina el valor entero de la propiedad sistema con el nombre especificado . El primer argumento se trata como el nombre de una propiedad del sistema. Se puede acceder a las propiedades del sistema a través del método System.getProperty (java.lang.String) . El valor de cadena de esta propiedad se interpreta entonces como un valor entero y se devuelve un objeto entero que representa este valor. Detalles de posibles formatos numéricos se pueden encontrar con la definición de getProperty.

Si no hay ninguna propiedad con el nombre especificado , si el nombre especificado está vacía o nula, o si la propiedad no tiene el formato correcto numérico , es un valor nulo.

que desea utilizar Integer.parseInt

+10

Nominación de función brillante. – roim

1

El uso de este método:

Integer.parseInt(bestMove.get("score")); 
10

que utilizaría el método Integer.valueOf(String n).

Integer bestScore = Integer.valueOf(bestMove.get("score")); 

De this blog, la razón que dieron,

Integer.getInteger(String) convierte una cadena a un número asumiendo la cadena es el nombre de una representación numérica propiedad del sistema . En otras palabras. Integer.getInteger("12345") es con probabilidad de producir null.

+2

No use 'valueOf' internamente es' Integer.valueOf (parseInt (s, 10)) '... donde 'parserInt()' no es más que 'Integer.parseInt (String)' con radix ** 10 * * – Favonius

+0

@Favonius, cierto, por lo tanto, es esencialmente lo mismo que 'Integer.parseInt (s, 10)'. Todavía sugeriría 'valueOf()' ya que la JVM lo usa para el autoboxing de todos modos. Lo que estoy diciendo es que, si está allí para usar, úsala. –

+0

Acepto que la JVM usa el valueOf pero eso es para 'valueOf (int)'. También la razón para usarlo en el autoboxing es 'cuando devuelve una instancia de Integer que representa el valor int especificado. Si no se requiere una nueva instancia de Entero, este método generalmente se debe usar con preferencia al Integer (int) del constructor, ya que es probable que este método produzca un mejor rendimiento de espacio y tiempo almacenando en caché valores solicitados con frecuencia. - Tomado de javadoc – Favonius

4

básico Integer.getInteger:

El método determina java.lang.Integer.getInteger(String nm, int val)el valor entero de la propiedad del sistema con el nombre .El argumento especificado val es el valor por defecto .
Un objeto Entero que representa el valor de la segundo argumento se devuelve si hay ninguna propiedad del nombre especificado, si la propiedad no tiene la correcta formato numérico, o si el nombre especificado es vacío o null.

O

El java.lang.Integer.getInteger(String nm) Determina el valor entero de la propiedad sistema con el nombre especificado. El argumento se trata como el nombre de propiedad del sistema. El valor de cadena de esta propiedad se interpreta como un valor entero y se devuelve un objeto entero que representa este valor. Si no hay ninguna propiedad con el nombre especificado, si el nombre especificado está vacía o nula , o si la propiedad no tiene la correcta formato numérico, entonces se devuelve nulo .

Nota: Las propiedades del sistema son accesibles a través del método System.getProperty(java.lang.String).


Solución de Uso: (Integer.parseInt/Integer.valueOf)

El java.lang.Integer.parseInt(String s) analiza el argumento de cadena como un entero decimal firmado . Los caracteres de la cadena deben ser todos dígitos decimales, excepto que el primer carácter puede ser un signo negativo ASCII'-' ('\u002D')-indican un valor negativo. Se devuelve el valor entero resultante, exactamente como si el argumento y la raíz 10 se hubieran dado como argumentos para el método parseInt(java.lang.String, int).

O

Los java.lang.Integer.valueOf(String s) devuelve un objeto Integer que sostienen el valor de la cadena especificado. El argumento se interpreta como que representa un entero decimal con signo, exactamente como si el argumento se hubiera dado al método parseInt(java.lang.String). El resultado es un objeto entero que representa el valor entero especificado por la cadena.
En otras palabras, este método devuelve un objeto entero igual al valor de:

new Integer(Integer.parseInt(s)) 
Cuestiones relacionadas