Есть ли способ игнорировать строку, если она не может быть parseInt без попытки и перехвата?

Например, если у меня есть текстовый файл, показывающий разные целые числа, но если он встретит значение, в котором есть, например, буква, он вызовет исключение NumberFormatException. Я много раз видел, как использовалась инструкция try-catch, но есть ли другой способ обработки этого исключения, помимо этого? Вот пример для txt-файла с именем «данные» (обратите внимание, что есть три целых числа, разделенных пробелом)

545F6 6 100

12N45 A 50

будет ли работать следующий код?

while (data.hasNextLine()){
    data.nextInt();
    if (!data.hasNextInt()){
        System.out.println("The number " + data.next() + " is invalid");
        data.next();
    }
}

Я новичок в Java, поэтому мне было любопытно, есть ли другой способ игнорировать строки и показать, что он недействителен, если он не возвращает целое число.


person greathye    schedule 27.02.2018    source источник
comment
Типа зависит от того, что вы подразумеваете под игнорированием строк. Если вы хотите игнорировать, скажем, 545F6, определенно есть способ сделать это. Я полагаю, что nextInt() будет читать до 545, так что это не будет сразу полезно для вас.   -  person Makoto    schedule 28.02.2018
comment
Что вы хотите, чтобы произошло? Считать 545 из 545F6 6 100 или получить из него 54576100?   -  person Frakcool    schedule 28.02.2018
comment
Возможный дубликат Проверьте, может ли строка анализироваться в Долго без try-catch?   -  person Ousmane D.    schedule 28.02.2018
comment
Все сложно. Дьявол кроется в деталях. Например, 0xcafebabe можно рассматривать как целое число, а 0999 можно отклонить как неправильное восьмеричное число. Вы можете проверить на [0-9]*, ну, но необязательно, он может иметь знак минус. Это может намного превышать пространство значений целых чисел или всего на 1. :) Не говоря уже о римских числах, таких как MMXVIII.   -  person user unknown    schedule 28.02.2018
comment
Возможный дубликат Java String удалить все нечисловые символы   -  person Frakcool    schedule 28.02.2018


Ответы (1)


Возможно, вы захотите попробовать регулярные выражения и использовать их в простом цикле, который проверяет, присутствуют ли в заданных строках, разделенных пробелами, только цифры (я добавил еще несколько пояснений в комментарии):

    String a = "545F6 6 100";
    String b = "12N45 A 50";

    List<String> results = new ArrayList<>(); // here you will store matching numbers
    for(String str : a.split("\\s+")) { // for each String that you get after splitting source String at whitespace characters...
        if(str.matches("\\b[\\d]+\\b")) { //check if that String matches given pattern: word boundary-only digits-word boundary
            results.add(str); // it there is a match, add this String to results ArrayList
        } else {
            System.out.println("The number " + str + " is invalid");
        }
    }

    System.out.println("Valid numbers: " + Arrays.toString(results.toArray())); // just to print results
    results.clear();
    System.out.println();

    for(String str : b.split("\\s+")) {
        if(str.matches("\\b[\\d]+\\b")) {
            results.add(str);
        } else {
            System.out.println("The number " + str + " is invalid");
        }
    }
    System.out.println("Valid numbers: " + Arrays.toString(results.toArray()));

Вывод, который вы получаете из этих циклов:

The number 545F6 is invalid
Valid numbers: [6, 100]

The number 12N45 is invalid
The number A is invalid
Valid numbers: [50]

Вы можете узнать больше о том, как использовать регулярные выражения, в документации Java API класса Pattern здесь.

person Przemysław Moskal    schedule 27.02.2018