2011-06-23 29 views
23

Me pregunto cómo hacer algo solo si Integer.parseInt (lo que sea) no falla.Java - comprobación si parseInt arroja la excepción

Más específicamente tengo una jTextArea de valores especificados por el usuario separados por saltos de línea.

Quiero verificar cada línea para ver si se puede convertir a una int.

Robusto algo como esto, pero no funciona:

for(int i = 0; i < worlds.jTextArea1.getLineCount(); i++){ 
        if(Integer.parseInt(worlds.jTextArea1.getText(worlds.jTextArea1.getLineStartOffset(i),worlds.jTextArea1.getLineEndOffset(i)) != (null))){} 
} 

Cualquier ayuda apreciada.

+5

encarga solamente de 'NumberFormatException'. –

+0

Posible duplicado de [¿Qué es NumberFormatException y cómo puedo solucionarlo?] (Http: // stackoverflow.com/questions/39849984/what-is-a-numberformatexception-and-how-can-i-fix-it) – xenteros

Respuesta

42
public static boolean isParsable(String input){ 
    boolean parsable = true; 
    try{ 
     Integer.parseInt(input); 
    }catch(ParseException e){ 
     parsable = false; 
    } 
    return parsable; 
} 

tener en cuenta que quería decir ParseException como el tipo adecuado de excepción para el caso específico

+6

No capte TODAS las excepciones. Esa es una mala práctica. –

+0

sí, tiene razón – fmucar

+5

NumberFormatException. También puede hacerlo bien. Está documentado. – EJP

4

parseInt tirará NumberFormatException si no puede analizar el número entero. Así que haciendo esto a responder a su pregunta

try{ 
Integer.parseInt(....) 
}catch(NumberFormatException e){ 
//couldn't parse 
} 
2

Puede utilizar el try..catch statement en Java, para capturar una excepción que se pueda derivar de Integer.parseInt().

Ejemplo:

try { 
    int i = Integer.parseint(stringToParse); 
    //parseInt succeded 
} catch(Exception e) 
{ 
    //parseInt failed 
} 
+0

¿Por qué el voto a favor? Esta es una respuesta válida, y aunque la captura de la Excepción es demasiado vaga para una buena práctica, funcionará. –

+1

@ josh.trow, lanzar una excepción al hacer un parseint también es una mala práctica, ya que realmente no es algo realmente excepcional, uno podría proporcionar un método analizable (para comprobar si se puede analizar) o convertirlo a un valor extraño (como Ruby y perl) –

+0

Entonces, ¿para qué sirve la excepción? – EJP

11

Sería algo como esto.

String text = textArea.getText(); 
Scanner reader = new Scanner(text).useDelimiter("\n"); 
while(reader.hasNext()) 
    String line = reader.next(); 

    try{ 
     Integer.parseInt(line); 
     //it worked 
    } 
    catch(NumberFormatException e){ 
     //it failed 
    } 
} 
23

Comprobar si es número entero analizable

public boolean isInteger(String string) { 
    try { 
     Integer.valueOf(string); 
     return true; 
    } catch (NumberFormatException e) { 
     return false; 
    } 
} 

o utilizar escáner

Scanner scanner = new Scanner("Test string: 12.3 dog 12345 cat 1.2E-3"); 

while (scanner.hasNext()) { 
    if (scanner.hasNextDouble()) { 
     Double doubleValue = scanner.nextDouble(); 
    } else { 
     String stringValue = scanner.next(); 
    } 
} 

o el uso de expresiones regulares como

private static Pattern doublePattern = Pattern.compile("-?\\d+(\\.\\d*)?"); 

public boolean isDouble(String string) { 
    return doublePattern.matcher(string).matches(); 
} 
+3

+1 para la verificación sin excepciones usando Scanner. –

2

en lugar de try ing & catch expresiones ING .. su mejor correr expresión regular en la cadena para asegurarse de que es un número válido ..

+0

¿Mejor cómo? ¿Por qué reinventar la rueda? ¿Por qué correr el riesgo de que la expresión regular no coincida con lo que hace parseInt()? ¿Por qué perder el tiempo y el dinero? – EJP

+2

cuando una excepción hay una sobrecarga (para la JVM) para preparar el seguimiento de la pila y luego continuar con la ejecución del programa (esto lleva un poco de tiempo) ... siempre es mejor verificar la expresión antes de analizarla ... –

+0

la sobrecarga es insignificante, y los otros problemas que planteé no lo son. Su declaración general no es compatible. – EJP

8

Puede utilizar un escáner en lugar de try-catch:

Scanner scanner = new Scanner(line).useDelimiter("\n"); 
if(scanner.hasNextInt()){ 
    System.out.println("yes, it's an int"); 
} 
Cuestiones relacionadas