0

我的代码当前编译并运行。但是,当程序到达该行时程序崩溃outputFile.println("Package: " + letter);为什么outputFile.println("Package: " + letter);和其他outputFile.println("");导致程序崩溃并且不打印到文件dataFiledataFile甚至在 try-catch 块执行时被创建?

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
}
4

1 回答 1

2

file当您在此行将变量传递给 Scanner 的构造函数时,您的变量为 null :

openFile = new Scanner(file);

此行将抛出 a NullPointerException,因为参数不能为 null,以便正确初始化 Scanner。

您代码中的扫描仪openFile似乎引用了您的代码中未直接指定的其他文件。鉴于此,我将假设您正在尝试将用户传递的文件(表示为dataFile)加载到 Scanner 中进行处理。为此,您可以利用采用字符串文件名/路径名的 File 构造函数。

新文件的 Javadoc(字符串路径名):

通过将给定的路径名​​字符串转换为抽象路径名来创建一个新的 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...

注意:您似乎已经为 File 变量执行此操作inFile。在其中我建议您将该声明移到顶部(并将其传递给openFile扫描器)或完全删除它并file在其余代码中使用您的对象。

于 2015-02-14T04:27:24.270 回答