Исключение NumberFormatException при последовательном чтении из файла?

#java #file-io #bufferedinputstream

#java #file-io #bufferedinputstream

Вопрос:

По сути, целью программы является запись информации о студенте в файл и чтение из того же файла. Программа включает в себя оператор if, чтобы сообщить, находится ли студент на хорошем счету или на академическом испытательном сроке, с соответствующими файлами для каждого (goodstanding.txt и probation.txt ). Если я закомментирую логику чтения для goodstanding.txt , программа работает с файлом, но мне они кажутся почти идентичными, если не считать пути к файлу, очевидно. Я просмотрел другие вопросы, но большинство из них, похоже, связаны с ошибочным приведением типов. Конкретная ошибка, которую он выдает, находится NumberFormatException For input string: "" в строке ID = Integer.parseInt(array[0]);

Вот логика записи:

 if(GPA >= 2.0) //If GPA >= 2.0, write to good standing file. This is 
               identical to probation writer, but causes an issue somewhere
{
     String result = ID   ","   fname   " "   lname   ","   GPA;
     OutputStream out = new BufferedOutputStream(Files.newOutputStream(good, 
     StandardOpenOption.CREATE));
     BufferedWriter wt = new BufferedWriter(new OutputStreamWriter(out));
     wt.write(result, 0, result.length()); //Write to file from position 0 to 
                                        length
     wt.newLine();
     System.out.println("Please enter next WIN or 999 to quit: ");
     ID = input.nextInt();
     input.nextLine();
     wt.close();
}
     if(GPA < 2.0) //If GPA < 2.0, write to probation file {
     String result = ID   ","   fname   " "   lname   ","   GPA;
     OutputStream out = new 
                   BufferedOutputStream(Files.newOutputStream(probation, 
                   StandardOpenOption.CREATE));
     BufferedWriter wt = new BufferedWriter(new OutputStreamWriter(out));
     wt.write(result, 0, result.length());
     wt.newLine();
     System.out.println("Please enter next WIN or 999 to quit: ");
     ID = input.nextInt();
     input.nextLine();
     wt.close();
}
  

И логика чтения:

 try
{
    while(line != null)
{
    array = line.split(",");
    ID = Integer.parseInt(array[0]);
    name = array[1];
    GPA = Double.parseDouble(array[2]);
    double ahead = GPA - 2;
    System.out.println("WIN: "   ID   " | "   " Name: "   name   " |"   " GPA                 
                        = "   GPA   " | Ahead by "   ahead);
    line = reader.readLine(); 
}
}
catch(NullPointerException e)
    {System.out.println("NullPointerException occurred");}
reader.close();


InputStream input2 = new
                     BufferedInputStream(Files.newInputStream(probation));
BufferedReader reader2 = new BufferedReader(new InputStreamReader(input2));
String line2 = reader2.readLine();
System.out.println();
System.out.println("---------------------------");
System.out.println("--Academic Probation List--");
System.out.println("---------------------------");
try{
while(line2 != null)
{
    array = line2.split(",");
    ID2 = Integer.parseInt(array[0]);
    name2 = array[1];
    GPA2 = Double.parseDouble(array[2]);
    double fallShort = 2 - GPA2;
    System.out.println("WIN: "   ID2   " | "   " Name: "   name2   " |"   " 
                       GPA = "   GPA2   " | Behind by "   fallShort);
    line2 = reader2.readLine();
}
}
catch(NullPointerException e)
{e.printStackTrace();}
reader.close();
  

Я также пытался использовать метод trim() для ID, но исключение осталось. Есть ли концепция, о которой мне нужно подробнее прочитать, которая объяснила бы это?

Комментарии:

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

2. Если вы ожидаете array[0] получить числовое значение, выполните проверку, прежде чем пытаться передать его как целое число.

3. Теперь также прочитайте свой код, и вам следует его значительно упростить. У вас есть несколько созданий bufferedwriter, когда вы действительно хотите открыть его один раз, выполните все свои записи, а затем закройте его, когда закончите. Ваша проблема не будет устранена, пока вы не поймете назначение потока (который должен указывать на файл и сохранять положение ваших записей и т. Д.)

Ответ №1:

Сообщение об ошибке ясно, я думаю NumberFormatException For input string: "" , как и вы, вы не можете разобрать пустую строку в int.

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

 ....
    while (line != null) {
        if(!line.startsWith(",") amp;amp; !line.isEmpty()){
            array = line.split(",");
            ID = Integer.parseInt(array[0]);
            name = array[1];
            GPA = Double.parseDouble(array[2]);
            double ahead = GPA - 2;
            System.out.println("WIN: "   ID   " | "   " Name: "   name   " |"   " GPA = "   GPA   " | Ahead by "   ahead);
        }
        line = reader.readLine();
    }