0

В настоящее время мой код компилируется и запускается. Тем не менее, программа вылетает, когда программа достигает линии outputFile.println("Package: " + letter); Почему outputFile.println("Package: " + letter); и другие outputFile.println(""); приводят к сбою программы и не распечатывают файл dataFile? Является ли dataFile даже созданным при выполнении блока try-catch?Почему в строке `outputFile.println (« Пакет: + письмо ») появляется ошибка ошибки исключительного исключения?

import java.util.Scanner; 
import java.text.NumberFormat; 
import java.util.InputMismatchException; 
import java.lang.NullPointerException; 
import java.io.*; 

public class Lab5backup 
{ 
    public static void main (String[] args) { 
     Scanner keyboard = new Scanner(System.in); 
     NumberFormat fmtCurr = NumberFormat.getCurrencyInstance(); 

     System.out.print("Data file of prior internet usage: "); 
     String dataFile = keyboard.nextLine(); 

     File file = null;   
     Scanner openFile = null;   
     FileWriter writeFile = null;  
     PrintWriter outputFile = null; 

     boolean invalid; 
      try { 
       openFile = new Scanner(file); 
       writeFile = new FileWriter(dataFile, true); 
       outputFile = new PrintWriter(writeFile); 
       invalid = false; 
      } 
      catch (FileNotFoundException fnfe) { 
       System.out.print("No such file exists; creating it.\n"); 
       invalid = true; 
      } 
      catch (NullPointerException npe) { 
       System.out.print("No such file exists; creating it.\n"); 
       invalid = true; 
      } 
      catch (IOException ioe) { 
       invalid = true; 
      } 

     File inFile = new File(dataFile); 

     if (inFile.exists()) { 
      averageHours = openFile.nextDouble(); 
      averagePaid = openFile.nextDouble(); 
      totalPaid = openFile.nextDouble(); 
      System.out.println("Usage history: "); 
      System.out.println(" Average Hours Used: " + averageHours); 
      System.out.println(" Average Paid: " + averagePaid); 
      System.out.println(" Total Paid: " + fmtCurr.format(totalPaid)); 
     } 
      //create and validate variables here 
      //taken out of example because not important to question 

      outputFile.println("Package: " + letter); 

      if (openFile.hasNextDouble()) 
       averageHours = ((hours + openFile.nextDouble())/numOfHourInputs++); 
      outputFile.println("Hours: " + hours); 

      if (openFile.hasNextDouble()) 
       averagePaid = ((charge + openFile.nextDouble())/numOfCharges++); 
      outputFile.println("Charge: " + charge);  
      outputFile.println("Average Hours: " + averageHours); 
      outputFile.println("Average Paid: " + averagePaid); 
      totalPaid += charge; 
      outputFile.println("Total Paid: " + totalPaid); 

      openFile.close(); 
      outputFile.close(); 

    } //end of main method 
} 
+0

Можете ли вы предоставить журнал ошибок с строкой, которая дает пустое исключение. –

+3

Ваша файловая переменная с именем 'file' имеет значение null, и вы передаете ее в сканер, который будет вызывать NPE. – initramfs

+2

Nice catch @CPUTerminator –

ответ

2

Ваш file переменная равна нулю, когда вы передаете его в конструктор сканера на этой линии:

openFile = new Scanner(file); 

Эта линия будет кинуть NullPointerException в качестве аргумента не может быть пустым для того, чтобы сканер быть правильно инициализирован.

Сканер openFile в вашем коде, похоже, ссылается на другой файл, не указанный непосредственно в вашем коде. Учитывая это, я собираюсь предположить, что вы пытаетесь загрузить файл, переданный пользователем (обозначенный как dataFile) в Сканер для обработки. Для этого вы можете использовать конструктор файла, который принимает имя файла/имя файла String.

Javadoc для нового файла (String имени пути):

Создает новый экземпляр File, преобразовывая данную строку имени пути в абстрактный путь. Если данная строка является пустой строкой, то результатом является пустой абстрактный путь.

Применяя это к коду:

Scanner keyboard = new Scanner(System.in); 
NumberFormat fmtCurr = NumberFormat.getCurrencyInstance(); 

double averageHours = 0; 
double averagePaid = 0; 
double totalPaid = 0; 

System.out.print("Data file of prior internet usage: "); 
String dataFile = keyboard.nextLine(); 

File file = new File(dataFile); 

// Your code continued below... 

Примечание: Вы, кажется, уже делают это для переменной файла inFile. В котором я предлагаю вам либо перенести эту декларацию в верхнюю часть (и передать ее в сканер openFile), либо полностью удалить ее и использовать свой объект file в остальной части вашего кода.

+0

Сделайте все в блоке try должны присутствовать инструкции? (только для справок в будущем). Также строка, в которой указывается 'outputFile.println (« Package: »+ letter),' дает мне ошибку времени выполнения, означает ли это, что строка 'outputFile = new PrintWriter (writeFile);' должен быть вне блока try? Спасибо за помощь! @CPUTerminator – freebird

+0

@freebird Все, что выбрасывает проверенное исключение (например, вещи, которые бросают «IOException»), нужно обрабатывать явно. Это может происходить из структуры try-catch или декларации 'throws'. Однако не существует правила, в котором структура try-catch должна существовать в любом вызове метода/создании объекта, то есть в то время как все инструкции, которые бросают 'IOException', должны обрабатываться, все они могут быть в своем собственном отдельном try-catch. Что касается ошибки времени выполнения, для ее решения требуется дополнительная информация. – initramfs

 Смежные вопросы

  • Нет связанных вопросов^_^