File fil = new File("Tall.txt");
FileReader inputFil = new FileReader(fil);
BufferedReader in = new BufferedReader(inputFil);
int [] tall = new int [100];
String s =in.readLine();
while(s!=null)
{
int i = 0;
tall[i] = Integer.parseInt(s); //this is line 19
System.out.println(tall[i]);
s = in.readLine();
}
in.close();
Я пытаюсь использовать файл «Tall.txt» для записи содержащихся в них целых чисел в массив с именем «tall». В некоторой степени он это делает, но также, когда я его запускаю, он выдает следующее исключение (:
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at BinarySok.main(BinarySok.java:19)
Почему именно это происходит и как это удалить? Как я вижу, я читаю файл как строки, а затем конвертирую его в целые числа, что не является незаконным.
Кстати, комментарий «это строка 19» является кандидатом на «Лучший комментарий из когда-либо виденных». Какую IDE вы используете?
Я понятия не имею, как это произошло. Думаю, я откуда-то взял части кода, и, видимо, пришли комментарии.




В вашем файле должна быть пустая строка.
Вы можете заключить свои вызовы parseInt в блок "try":
try {
tall[i++] = Integer.parseInt(s);
}
catch (NumberFormatException ex) {
continue;
}
Или просто проверьте наличие пустых строк перед синтаксическим анализом:
if (s.length() == 0)
continue;
Обратите внимание, что при инициализации вашей индексной переменной i внутри цикла она всегда равна 0. Вы должны переместить объявление перед циклом while. (Или сделайте его частью цикла for.)
по всей вероятности, это ПОСЛЕДНЯЯ строка файла.
Похоже, Java пытается преобразовать пустую строку в число. У вас есть пустая строка в конце ряда чисел?
Вероятно, вы могли бы исправить такой код
String s = in.readLine();
int i = 0;
while (s != null) {
// Skip empty lines.
s = s.trim();
if (s.length() == 0) {
continue;
}
tall[i] = Integer.parseInt(s); // This is line 19.
System.out.println(tall[i]);
s = in.readLine();
i++;
}
in.close();
У вас может возникнуть путаница между разными окончаниями строк. В файле Windows каждая строка завершается символом возврата каретки и перевода строки. Некоторые программы в Unix будут читать этот файл, как если бы между каждой строкой была лишняя пустая строка, потому что они увидят возврат каретки как конец строки, а затем увидят перевод строки как другой конец строки.
Нет, не имеет значения, на какой платформе работает приложение, BufferedReader всегда проверяет наличие всех трех типов разделителей строк: \ r \ n (возврат каретки + перевод строки), \ n (только перевод строки) и \ r (каретка только возврат).
Возможно, вы захотите сделать что-то вроде этого (если вы используете java 5 и выше)
Scanner scanner = new Scanner(new File("tall.txt"));
int [] tall = new int [100];
int i = 0;
while(scanner.hasNextInt()){
tall[i++] = scanner.nextInt();
}
@ Вануан: java.util.ArrayList
Для сравнения вот еще один способ прочитать файл. У него есть одно преимущество: вам не нужно знать, сколько целых чисел находится в файле.
File file = new File("Tall.txt");
byte[] bytes = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(bytes);
fis.close();
String[] valueStr = new String(bytes).trim().split("\\s+");
int[] tall = new int[valueStr.length];
for (int i = 0; i < valueStr.length; i++)
tall[i] = Integer.parseInt(valueStr[i]);
System.out.println(Arrays.asList(tall));
File file = new File("E:/Responsibility.txt");
Scanner scanner = new Scanner(file);
List<Integer> integers = new ArrayList<>();
while (scanner.hasNext()) {
if (scanner.hasNextInt()) {
integers.add(scanner.nextInt());
} else {
scanner.next();
}
}
System.out.println(integers);
Кстати, вы должны объявить «i» вне цикла while. если нет, вы всегда будете вставлять целые числа в индекс 0 вашего массива.