Попытка перехватить исключения при преобразовании массива строк в целые числа

У меня есть текстовый документ со списком чисел, обработанных знаком "|". Бывший:

0|0|2
1|0|1
1|1|0
2|0|1
2|1|0
2|2|1
3|0|0
3|1|1
3|2|0
3|3|1

Я генерирую этот код, и все способы имеют дополнительную строку внизу. Я знаю, что у меня всегда будет эта строка, и я написал свой код соответствующим образом со значением -1 при создании массива int. Проблема в том, что после редактирования файла у меня есть две строки вместо одной. Помимо входа в файл для удаления лишней строки, я хотел, чтобы код мог игнорировать эту проблему. мой текущий код, который работает без дополнительной строки:

while(scc.hasNextLine()){  
    String[] temp = scc.nextLine().split("\\|");
    for(int j = 0; j < 3; j++){             
        arr[points][j] = Integer.parseInt(temp[j]);
    }         
    points++;
}
scc.close();

Это работает и не дает никаких исключений, пока внизу находится только одна строка. но когда их два, у меня возникает «NumberFormatException» из-за пустой строки без целых чисел.

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

Я попытался поймать исключение, используя следующее:

while(scc.hasNextLine()){
    String[] temp = scc.nextLine().split("\\|");
    for(int j = 0; j < 3; j++){
        try{
            arr[points][j] = Integer.parseInt(temp[j]);
        }
        catch (NumberFormatException ignore){}
    }
    points++;
}
scc.close();

Это вызвало новую ошибку «ArrayIndexOutOfBoundsException», когда игнорирование обоих моих выходных данных становится только одной строкой кода вместо списка чисел.

прочитайте строку в переменную, например String line = scc.nextLine();, затем проверьте line.isEmpty()или какую-нибудь другую проверку. Затем разделите его и убедитесь, что в полученном массиве есть temp.length == 3. Если нет, игнорируйте и эту строку.

f1sh 13.08.2024 16:56

Вместо выполнения j < 3 («магического числа») вы можете захотеть либо j < temp.length;, либо вызвать исключение, если найдена непустая строка с temp.length != 3 (чтобы вы могли исправить эту проблему).

Rogue 13.08.2024 16:57
j < temp.length, вероятно, не является хорошим решением — со временем оно скроет ошибки ввода — вы, вероятно, также захотите проверить, не становится ли points слишком большим
user85421 13.08.2024 17:43

@Rogue в этом случае лучше всего использовать «магическое число», поскольку я знаю, что файл будет генерировать только 3 разных значения. мой «arrayindexoutofboundsExceptions» исходил из местоположения точек++ внутри цикла for. переместив цикл for внутри моего оператора try, я больше не получал ошибку массива.

George Volz 13.08.2024 17:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

String.isEmpty

Если вы просто хотите игнорировать пустые строки, проверьте длину строки.

String line = scc.nextLine() ;
if ( ! line.isEmpty() ) { … } // Ignore any empty lines. 

Array.length

Проверьте все введенные вами данные, включая количество полей в каждой строке входящего текста.

String line = scc.nextLine() ;
if ( ! line.isEmpty() ) // Ignore any empty lines. 
{
    String[] parts = line.split( "\\|" );
    if ( parts.length == 3 ) 
    {
        … handle valid input
    }
    else
    {
        … handle faulty input
    }
}

Кодовые точки

В реальной работе я сканировал каждую строку, проверяя все кодовые точки , чтобы убедиться, что все символы являются либо цифрами, либо символом вертикальной черты, используемой здесь в качестве разделителя.

// Every character must be either a digit or a VERTICAL BAR. 
// The code point for VERTICAL BAR (`|`) character is 124 (0x7C). 
if ( line.codePoints().filter( codePoint -> ! ( Character.isDigit( codePoint ) || codePoint == 124 ) ).count() > 0L ) { … handle unexpected characters … }

К вашему сведению, Character.isDigit проверяет наличие большего количества цифр, чем просто цифры ISO-LATIN-1 (от «0» до «9»). Поэтому вы можете написать более узкий тест.

Спасибо. Я сразу попробовал это. и хотя он устранил проблему, у меня та же проблема с игнорированием обоих исключений. вероятно, трудно помочь без всего кода. но спасибо, я бы даже не подумал об этом решении.

George Volz 13.08.2024 17:14

@GeorgeVolz Рад, что ты решил свою проблему! Вместо добавления «Решено» в конце заголовка примите этот ответ, нажав кнопку с галочкой, чтобы выразить свою благодарность и сообщить, что на вопрос дан ответ.

Andrew Yim 13.08.2024 17:36

@GeorgeVolz Рад помочь. Идея, которую следует помнить, — никогда не доверять входным данным. Проверьте свои предположения о входящих данных перед их обработкой.

Basil Bourque 13.08.2024 17:46

Другие вопросы по теме