Попробуйте / поймать блоки и операторы if в программе усреднения осадков - PullRequest
0 голосов
/ 06 апреля 2020

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

package experiment8;
import java.io.*; 
import java.util.Scanner; 
public class Exceptions
{
  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 scan = new Scanner (System.in);
          Scanner file = new Scanner(new File("inData.dat"));
          fileOk = true;
        }
        catch(FileNotFoundException error)
        {

          System.out.println("Reenter file name>");
          fileName = inName.nextLine();
          fileTry++;
        }
    } while (!fileOk && fileTry < 4);
    PrintWriter outFile = new PrintWriter(new FileWriter("outData.dat"));

    if (fileOk && fileTry < 4 )
    {   
        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();
  }
}

Я пытаюсь закодировать эту программу, чтобы при вводе правильного имени файла «inData.dat» я получал правильный вывод. Однако, когда я делаю это, мне продолжают предлагать повторно ввести имя файла в течение следующих 3 раз, после чего я получаю сообщение «Ошибка». Что-то не так с моими блоками try / catch или операторами if?

Ответы [ 2 ]

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

Есть много проблем с вашей программой. Вот несколько, чтобы помочь вам в пути.

  1. Файл inData.dat не существует. Пожалуйста, создайте его в соответствующем месте.
  2. После того, как вы преодолеете этот горб, в строке 40 появится нулевой указатель: inFile равно нулю.

Моя рекомендация: откройте его в редакторе, например Visual Studio Code . Это будет указывать на множество предупреждений, и вы также сможете отладить свою программу.

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

У меня есть два вопроса о вашем коде.

  1. Какова цель строки Scanner scan = new Scanner (System.in); в блоке try?

  2. Почему у вас есть проверка оператора if if (fileOk && fileTry < 4) после блока do-while для получения файла? Это кажется излишним. Блок do-while проверяет то же условие. Как только программа попадет в местоположение этого оператора if, это условие должно быть выполнено. Если бы это было не так, сделка была бы снова запущена.

Вы можете перейти к случаю, когда задание заканчивается, потому что файл был найден, и условие этого оператора if ложно, потому что fileTry <4. I не понимаю, почему вы будете беспокоиться о счетчике fileTry, как только вы нашли правильный файл. Если пользователь попытался ввести имя файла 4 раза и получил его правильно с последней попытки, программа go переведет остальную часть этого оператора if и напечатает «Ошибка». </p>

...