У меня есть текстовый документ со списком чисел, обработанных знаком "|". Бывший:
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», когда игнорирование обоих моих выходных данных становится только одной строкой кода вместо списка чисел.
Вместо выполнения j < 3
(«магического числа») вы можете захотеть либо j < temp.length;
, либо вызвать исключение, если найдена непустая строка с temp.length != 3
(чтобы вы могли исправить эту проблему).
j < temp.length
, вероятно, не является хорошим решением — со временем оно скроет ошибки ввода — вы, вероятно, также захотите проверить, не становится ли points
слишком большим
@Rogue в этом случае лучше всего использовать «магическое число», поскольку я знаю, что файл будет генерировать только 3 разных значения. мой «arrayindexoutofboundsExceptions» исходил из местоположения точек++ внутри цикла for. переместив цикл for внутри моего оператора try, я больше не получал ошибку массива.
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»). Поэтому вы можете написать более узкий тест.
Спасибо. Я сразу попробовал это. и хотя он устранил проблему, у меня та же проблема с игнорированием обоих исключений. вероятно, трудно помочь без всего кода. но спасибо, я бы даже не подумал об этом решении.
@GeorgeVolz Рад, что ты решил свою проблему! Вместо добавления «Решено» в конце заголовка примите этот ответ, нажав кнопку с галочкой, чтобы выразить свою благодарность и сообщить, что на вопрос дан ответ.
@GeorgeVolz Рад помочь. Идея, которую следует помнить, — никогда не доверять входным данным. Проверьте свои предположения о входящих данных перед их обработкой.
прочитайте строку в переменную, например
String line = scc.nextLine();
, затем проверьтеline.isEmpty()
или какую-нибудь другую проверку. Затем разделите его и убедитесь, что в полученном массиве естьtemp.length == 3
. Если нет, игнорируйте и эту строку.