#java
#ява
Вопрос:
Привет, в настоящее время я создаю программу, которая позволит мне ввести путь к файлу .txt в формате:
Имя дома: Имя гостя: Оценка дома: Оценка гостей
Ливерпуль: Челси: 2: 1
Шпоры: Фулхэм: 1: 1
и он должен выводиться в консоль по порядку. Однако у меня возникли проблемы с моими исключениями. Я пытаюсь отобразить его так, чтобы, если отсутствует какой-либо параметр, такой как разделитель, название команды / оценка, он выводил ошибку на консоль. Я хочу, чтобы он отображал все отсутствующие параметры, а не только один. Например, отсутствует название домашней команды. Название команды гостей отсутствует. Нет разделителя полей. Неверный домашний счет, убедитесь, что это целое число.
Любая помощь высоко ценится. Спасибо!
Текущий код, который у меня есть сейчас, является:
Комментарии:
1. Вы почти всегда должны регистрировать возникающие исключения, конечно, если вы уже знаете, что что-то работает не так, как ожидалось.
2. Если вы не знаете, что исключение можно игнорировать, я бы распечатал его и посмотрел на строку, в которой произошла ошибка. Затем я бы прошелся по программе в вашем отладчике, чтобы понять, почему приложение ведет себя так, как оно есть.
3. Если у меня есть пустое поле, такое как «Название удаленной команды», это не выдает ошибку. Он продолжит печать на консоли без этого имени команды.
4. Вместо
System.out.println()
вы должны сделатьthrow new ArrayIndexOutOfBoundsException ("some text")
, если хотите перехватить ваше исключение
Ответ №1:
Ошибка вызвана тем, что первая строка вашего файла является заголовком Home Name : Away Name: Home Оценка: Away Оценка
И когда вы попытаетесь разобрать разделенный текст на int
, он не сможет разобрать и выдаст ошибку в следующей строке вашего кода
int homeScore = Integer.parseInt(splitText[2].trim());
Я надеюсь, что это даст вам направление для поиска решения вашего вопроса. Хотя довольно сложно «угадать» проблему, поскольку нет никакой ошибки stacktrace.
Комментарии:
1. Извините, я должен был упомянуть, что в файле нет заголовка. То, что я поместил выше, просто для того, чтобы показать вам, как я отформатировал его в файле.
2. Есть ли у вас дополнительные разрывы строк в файле, как вы добавили выше в примере?
3. Нет дополнительных строк разрыва. Он находится в формате, указанном выше, с несколькими разными записями.
Ответ №2:
Если вы хотите отобразить все ошибки, вам не следует использовать исключения. Они предназначены для использования в случае, если произойдет что-то неожиданное. Вместо этого вы должны выполнять подобные проверки splitText[0].length() == 0
и т.д. и собирать все ошибки. При этом ArrayIndexOutOfBoundsException
может быть заменено проверкой на splitText.length < 4
(и, конечно, следующие проверки также должны учитывать это).
Это NumberFormatException
может быть исключением из этого правила, потому что вам придется либо проверить, является ли строка числом, а затем попытаться проанализировать ее, либо просто попробовать и перехватить исключение, чтобы узнать, что это не число.
Тогда ваш код мог бы выглядеть следующим образом:
List<String> errors = new LinkedList<>();
if( splitText.length < 4) {
errors.add("Fields might be missing")
}
//do other checks here
//if all fields are present, check the numbers (this could be done in some method)
int homeScore = -1;
try {
homeScore = Integer.parseInt(splitText[2].trim());
} catch( NumberFormatException e) {
errors.add("Homescore is not an integer");
}
//other checks and then finally:
if( errors.isEmpty() ) {
//everything ok
} else {
//print the collected errors
}
Обратите внимание, что некоторые проверки не имеют смысла, если другие уже завершились неудачей, т. Е. Разбор значения не имеет смысла, если длина массива меньше 4 или если 4-й элемент является пустой строкой (по крайней мере, после обрезки). Это необходимо было бы принять во внимание.
Комментарии:
1. Привет. Как бы мне напечатать собранные ошибки? Спасибо.
2. @Phenj ну, вы уже напечатали ошибки, не так ли (ваш вопрос больше не содержит кода). Поскольку этот список содержит ошибки для каждой строки (т. Е. Он должен быть воссоздан или очищен при проверке следующей строки ввода), вам просто нужно перебрать строки в этом списке и распечатать их.