Программа, которая вычисляет среднее число чисел из файла (задействованы блоки try / catch) - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть программа, которая должна позволять пользователю вводить имя файла, которое, если оно правильно, вычисляет среднее число чисел в файле и распечатывает его. Аналогично, если пользователь вводит неправильное имя файла определенное количество раз, то программа завершает работу. В программе предполагается, что блок «try» создает экземпляр Scanner и устанавливает для fileOk значение true, а блок «catch» должен побуждать пользователя повторно вводить имя файла, читать файл и увеличивать fileTry. Первый оператор «if» также должен сделать так, чтобы вычислялось среднее значение или в выходной файл записывалось сообщение об ошибке (outNumbers.dat). Вот код, который у меня есть:

package average;
import java.io.*; 
import java.util.Scanner; 
public class Try
{
  static  Scanner inFile;
  public static void main(String[] args) throws IOException
  {
    int fileTry = 0;
    String fileName;
    Scanner inName = new Scanner(System.in);
    System.out.println("Enter file name>");
    fileName = inName.nextLine();
    boolean fileOk;
    do
    {
      fileOk =  false;
      try
        {
          Scanner file = new Scanner(new File(fileName));
          fileOk = true;
        }
        catch(FileNotFoundException error)
        {
          System.out.println("Reenter file name>");
          fileName = inFile.nextLine();
          fileTry++;
        }
    } while (!fileOk && fileTry < 4);
    PrintWriter outFile = new PrintWriter(new FileWriter("outNumbers.dat"));

    if (fileName != null )
    {   
        int numDays = 0;
        double average;
        double inches = 0.0;
        double total = 0.0;
        while (inFile.hasNextFloat())
      {
        inches = inFile.nextFloat();
        total = total + inches;
          outFile.println(inches);
          numDays++;
      }

      if (numDays == 0) 
        System.out.println("Average cannot be computed " +
                         " for 0 days."); 
      else
      {
        average = total / numDays;
        outFile.println("The average rainfall over " +  
          numDays + " days is " + average); 
      }
      inFile.close();
    }
    else
      System.out.println("Error");
    outFile.close();
  }
}

А вот содержимое правильного файла (inNumbers.dat):

2.3 
3.1 
0.3 
1.1 
2.2 
2.1 
0.0 
0.4 
0.76 
0.5 
1.0 
0.5

Это вывод, который я получаю после запуска программа и ввод правильного имени файла:

Enter file name>
inNumbers.dat
Exception in thread "main" java.lang.NullPointerException
    at average.Try.main(Try.java:40)

Я немного растерялся, как это исправить: /

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Ваша программа должна быть реструктурирована, чтобы избавиться от NullPointerException. Глядя на ваш код, я предполагаю, что вы сможете понять изменения. Не стесняйтесь комментировать в случае каких-либо сомнений.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws IOException {
        Scanner inFile = null;
        int fileTry = 0;
        String fileName;
        Scanner inName = new Scanner(System.in);
        boolean fileOk;
        PrintWriter outFile = null;
        do {
            fileOk = true;
            System.out.print("Enter file name>");
            fileName = inName.nextLine();
            try {
                inFile = new Scanner(new File(fileName));
                outFile = new PrintWriter(new FileWriter("outNumbers.dat"));

                int numDays = 0;
                double average;
                double inches = 0.0;
                double total = 0.0;
                while (inFile.hasNextFloat()) {
                    inches = inFile.nextFloat();
                    total = total + inches;
                    outFile.println(inches);
                    numDays++;
                }
                if (numDays == 0)
                    System.out.println("Average cannot be computed " + " for 0 days.");
                else {
                    average = total / numDays;
                    outFile.println("The average rainfall over " + numDays + " days is " + average);
                }
                inFile.close();

            } catch (FileNotFoundException error) {
                if (fileTry < 3) {
                    System.out.println("The filename is wrong. Please try again.");
                }
                fileTry++;
                fileOk = false;
            }
        } while (!fileOk && fileTry < 4);
        if (outFile != null) {
            outFile.close();
        }
        if (fileTry == 4) {
            System.out.println("You exceeded maximum number of tries. Please try later. Goodbye!");
        }
    }
}

Пример прогона:

Enter file name>a
The filename is wrong. Please try again.
Enter file name>b
The filename is wrong. Please try again.
Enter file name>c
The filename is wrong. Please try again.
Enter file name>d
You exceeded maximum number of tries. Please try later. Goodbye!

Если вы попытаетесь с правильным именем файла, он выдаст outNumbers.dat со всеми расчетными данными. Не стесняйтесь комментировать в случае любой проблемы.

0 голосов
/ 06 апреля 2020

NullPointerException очень часто встречается в java. Это часто означает, что вы пытаетесь работать с объектом, который никогда не был инициализирован. В этом случае infile только объявляется и никогда не инициализируется.

Scanner file = new Scanner(new File(fileName));

Переменная file существует только в блоке try, поскольку именно там она была объявлена. Вы, вероятно, хотели инициализировать infile вместо.

infile = new Scanner(new File(fileName));

...