2011-06-23 22 views
23

Zastanawiam się, jak coś zrobić, tylko jeśli Integer.parseInt (cokolwiek) nie zawiedzie.Java - sprawdzanie, czy parseInt wyrzuca wyjątek

Dokładniej mam jTextArea wartości określonych przez użytkownika oddzielone przez podziały wiersza.

Chcę sprawdzić każdą linię, aby przekonwertować ją na wartość int.

sylwetka coś takiego, ale to nie działa:

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

Każda pomoc mile widziana.

+5

tylko obsługiwać 'NumberFormatException'. –

+0

Możliwy duplikat [Co to jest wyjątek NumberFormatException i jak mogę to naprawić?] (Http: // stackoverflow.com/questions/39849984/what-is-a-numberformatexception-and-how-can-i-fix-it) – xenteros

Odpowiedz

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

pamiętać, że oznaczało ParseException jako właściwego rodzaju wyjątkiem w konkretnym przypadku

+6

Nie przechwytuj WSZYSTKICH wyjątków. To naprawdę zła praktyka. –

+0

tak, masz rację – fmucar

+5

NumberFormatException. Równie dobrze możesz to naprawić. Jest to udokumentowane. – EJP

4

parseInt rzuci NumberFormatException jeśli nie można analizować całkowitą. Czyniąc to odpowie na Twoje pytanie

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

Można użyć try..catch statement w Javie, aby przechwycić wyjątek, które mogą wyniknąć z Integer.parseInt().

Przykład:

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

Dlaczego upadek? Jest to poprawna odpowiedź, i choć wykrywanie wyjątków jest zbyt ogólnikowe, by można było je stosować, zadziała. –

+1

@ josh.trow, wyrzucenie wyjątku podczas robienia parseintu to także zła praktyka, ponieważ naprawdę nie jest czymś naprawdę wyjątkowym, można podać metodę parsowalną (aby sprawdzić, czy można ją przetworzyć) lub przekonwertować ją na dziwną wartość (jak Ruby i perl) –

+0

Więc jaki jest wyjątek? – EJP

11

Byłoby coś takiego.

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

Sprawdź, czy jest całkowitą parsowalnym

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

lub użyj Skaner

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(); 
    } 
} 

lub użyj Regular Expression jak

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

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

+1 w celu weryfikacji bez wyjątków za pomocą skanera. –

2

zamiast try ing & catch wyrażeń Ing .. jej lepiej uruchomić regex na ciąg, aby zapewnić, że jest to ważny numer ..

+0

Lepiej jak? Po co wyważać koło? Dlaczego istnieje ryzyko, że wyrażenie regularne nie pasuje do tego, co robi funkcja parseInt()? Po co tracić czas i pieniądze? – EJP

+2

gdy wystąpi wyjątek, istnieje narzut (dla JVM), aby przygotować ślad stosu, a następnie kontynuować wykonywanie programu (jest to trochę czasochłonne) ... zawsze lepiej sprawdzić wyrażenie przed analizą .. –

+0

koszty ogólne są nieznaczne, a pozostałe problemy, które podniosłem, nie są. Twoje ogólne oświadczenie nie jest obsługiwane. – EJP

8

Można użyć skanera zamiast try-catch:

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