使用PrintWriter时出错

时间:2016-10-07 17:52:52

标签: java printwriter

我正在尝试编写一个程序,提示用户输入速度和时间。在此之后,我需要计算distance = velocity * time。如果用户输入的时间小于零且大于时间,则需要重新提示用户。

Hour        Distance Travelled
===========================
1           40
2           80
3           120

例如,如果用户输入时间为5,则表格应类似于以下内容:

Hour        Distance Travelled
===========================
1           40
2           80
3           120
4           160
5           200

我需要一个像上面这样的表,但我需要将表输出到文本文件。

这是我的代码:

import java.io.*;
import java.util.Scanner;

public class Lab4 {
    public static void main(String[] args) throws IOException {
        double distance;
        double velocity;
        double time;

        System.out.println("enter the velocity and time");
        Scanner sn = new Scanner(System.in);
        velocity = sn.nextDouble();
        time = sn.nextDouble();

        do {
            System.out.print(" Time cannot be smaller than zero and larger than ten");
            System.out.print("Please enter again");
            time = sn.nextDouble();
        } while(time < 0 && time > 10);

        System.out.print("please enter the file name");
        String filename = sn.nextLine();

        PrintWriter outputFile = new PrintWriter(filename);
        distance = velocity*time;
        outputFile.println(distance);
    }
}

问题1为什么我收到此错误:

PrintWriter outputFile = new PrintWriter(filename);
^
bad source file: .\PrintWriter.java
file does not contain class PrintWriter
Please remove or make sure it appears in the correct subdirectory of the sourcepath.

问题2:我该如何绘制该文件?

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题,aleb2000已经提到了一个很大的问题(采取 aleb2000 的建议),但我们只会触及您的问题最终的问题和那个问题。是你收到的错误。

您收到此错误是因为您提供的输出文件名实际上是扫描程序换行符字符而 PrintWriter 不知道如何处理该错误。它不是它识别为有效路径和文件名的东西。

为什么提供的文件名不正确?嗯,它实际上非常简单,当使用nextInt(),nextDouble()方法或任何需要提供数值的Scanner方法时,Scanner类有一点怪癖,那就是当你点击时键盘上的输入按钮,您还提供一个换行符,该换行符仍保存在扫描仪缓冲区中,只有在您要求提供文件名时使用Scanner.newLine()方法时才会释放该换行符。换行符不会与您提供的数值一起发出,但是当您提供文件名时,它会从缓冲区中向前拉,并取代实际为文件名键入的内容。这对你有意义吗?

幸运的是,这个问题有一个简单的解决方案,就是在最后一个数字输入请求之后直接将 Scanner.newLine()方法应用于任何内容(无变量),例如:< / p>

time = sn.nextDouble(); sn.nextLine();

你显然也希望在do / while循环中执行此操作,但在我看来你应该取消do / while并且只使用这样的while循环(你明白为什么?):

while(time < 0.0 || time > 10.0) {
    System.out.println("Time cannot be smaller than zero and larger than ten!");
    System.out.print("Please enter again: --> ");
    time = sn.nextDouble(); sn.nextLine();
} 

哦......当任务完成后,不要让关闭 PrintWriter对象和扫描程序对象。