Ошибка при использовании PrintWriter

#java #printwriter

#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 amp;amp; 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. Пройденное часовое расстояние ===========================

2. Подсказка: используйте функцию предварительного просмотра , чтобы убедиться, что ваш вопрос правильно отформатирован. Над вашим беспорядочным вводом уже работают два человека! В следующий раз потратьте на это больше времени!

3. Также вам следует изменить условие while, число не может быть < 0 и> 10 одновременно, я предлагаю вам написать while(time < 0 || time > 10)

4. Ваша проблема в том, что у вас есть PrintWriter.java файл рядом с Lab4.java исходным файлом. Это скрывает java.io.PrintWriter класс, а PrintWriter.java файл является «плохим исходным файлом», хотя точно, что это означает, неясно (вероятно, он не объявляет PrintWriter класс). Просто сделайте то, что указано в сообщении об ошибке: пожалуйста, удалите .

5. Используйте IDE (интегрированную среду разработки), такую как Eclipse , это избавит вас от лишних хлопот.

Ответ №1:

Существует ряд проблем с вашим кодом, и aleb2000 уже упоминал о большой проблеме (воспользуйтесь советом aleb2000), но мы коснемся только того, о чем в конечном итоге ваш вопрос, и это ошибка, которую вы получаете.

Вы получаете эту ошибку, потому что предоставленное вами имя выходного файла на самом деле является символом новой строки сканера, и PrintWriter не знает, что с этим делать. Это не то, что он распознает как допустимый путь и имя файла.

Почему указанное вами имя файла неверно? Ну, на самом деле это довольно просто, есть небольшая проблема с классом Scanner при использовании методов nextInt(), nextDouble() или любого другого метода сканирования, если на то пошло, который ожидает, что будет предоставлено числовое значение, и когда вы нажимаете кнопку ввода на клавиатуре, вы такжеввод символа новой строки, который остается сохраненным в буфере сканера и освобождается только тогда, когда используется метод 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, так и ваш объект Scanner после завершения задачи.