使用 PrintWriter 时出错

Error when using PrintWriter

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

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

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

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

我需要像上面那样的 table,但我需要将 table 输出到文本文件。

这是我的代码:

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:如何绘制该文件?

你的代码有很多问题,aleb2000 已经提到了一个大问题(采纳 aleb2000 的建议),但我们只会讨论你的问题最终是关于,这就是您收到的错误。

您收到此错误是因为您提供的输出文件名实际上是一个 Scanner newline 字符,而 PrintWriter 不知道是什么这样做。这不是它识别为有效路径和文件名的东西。

为什么您提供的文件名不正确?好吧,这实际上很简单,在使用 nextInt()、nextDouble() 方法或任何需要提供数值的 Scanner 方法时,Scanner Class 有一个小问题,并且是当您按下键盘上的回车按钮时,您还提供了一个换行符,该换行符仍存储在扫描仪缓冲区中,并且仅在使用 Scanner.newLine() 方法时才释放,就像您在请求文件名时所做的那样待供应。换行符不会随您提供的数值一起发布,但是,当您提供文件名时,它会从缓冲区中向前拉出并取代实际为文件名键入的内容。这对你有意义吗?

幸运的是,这个问题有一个简单的解决方案,那就是在你的最后一个数字之后直接将 Scanner.newLine() 方法应用到空(无变量)输入请求,例如:

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 对象和扫描仪对象。