NoSuchElementException и многое другое - PullRequest
0 голосов
/ 02 мая 2019

Мое назначение:

  • Создать файл с двумя столбцами чисел: Расстояние и Скорость .
  • Написатькласс TravelInfo, имеющий три элемента информации: скорость , время , расстояние .
  • В классе также должен быть метод calcTime(), который рассчитывает время, необходимое для достижения пункта назначения, на основе расстояния и скорости (напомним: Время = Расстояние / Скорость)
  • ЗаписьОсновная программа, которая:
    • Создает ArrayList TravelInfo объектов размером 10.
    • Запрашивает у пользователя имя файла и считывает данные в TravelInfo объекты
    • Вызывает метод calcTime() для каждого объекта TravelInfo.
    • Создает выходной файл с данными, записанными в формате: Расстояние, Время, Скорость

Каждый раз, когда я запускаю свою программу, я получаю сообщение об ошибке

Исключение в потоке "main" java.util.NoSuchElementException

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

Вот мой main() метод:

public static void main(String[] args) throws IOException {

    Scanner keyboard = new Scanner(System.in);
    ArrayList<TravelInfo> list = new ArrayList<>();

    System.out.println("What is the name of the file?");
    String filename = keyboard.nextLine();
    File f = new File(filename);
    Scanner inputFile = new Scanner(f);
    while(inputFile.hasNext()) {
        int s = inputFile.nextInt();
        int d = inputFile.nextInt();
        int t = inputFile.nextInt();


        TravelInfo p = new TravelInfo(s, d, t);
        list.add(p);
        TravelInfo cls = new TravelInfo(s,d,t);
        cls.calcTime(t);
        cls.calcTime(s);
        cls.calcTime(d);

       // System.out.println("Time is " + cls.calcTime(t));

       /*for(int i=0; i<list.size(); i++) {
           list.get(i).print();
      */ }
        for(TravelInfo k : list)
            System.out.println(k);

        PrintWriter outputFile = new PrintWriter("Data.txt");
        outputFile.println(list);
        //outputFile.println();
        outputFile.close();
    }

}

И мой TravelInfo класс

public class TravelInfo {
    private int speed;
    private int distance;
    private int time;

    public TravelInfo(int s, int d, int t) {
        speed = s;
        distance = d;
        time = t;
    }
    public int calcTime(int time) {
        time = distance/speed;
        return time;
    }
}

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Как сказал Дориан, вам не хватает какой-то проверки:

while(inputFile.hasNext()) // Tells you there is "at least" 1 more element.
{
    int s = inputFile.nextInt();   // Good
    int d = inputFile.nextInt();   // Not good if 's' has taken the last element
    int t = inputFile.nextInt();   // Same as above

    // rest of the code here...
}

Лично мне не нравится материал "while (true)", поэтому вот моя версия.

while(inputFile.hasNextInt())  // I would use 'hasNextInt()' rather than 'hasNext()'
                               // This will make sure the next data can be cast to an Integer
{
    Integer d = null;
    Integer t = null;
    Integer s = inputFile.nextInt();

    if( inputFile.hasNextInt() {
        d = inputFile.nextInt();
        if( inputFile.hasNextInt() {
            t = inputFile.nextInt();
        }
    }

    // 's' will never be null.
    if( d != null && t != null ) {
        TravelInfo p = new TravelInfo(s, d, t);
        list.add(p);
        TravelInfo cls = new TravelInfo(s,d,t);
        cls.calcTime(t);
        cls.calcTime(s);
        cls.calcTime(d);

       // System.out.println("Time is " + cls.calcTime(t));

       /*for(int i=0; i<list.size(); i++)
       {
           list.get(i).print();
      */ }
        for(TravelInfo k : list)
            System.out.println(k);

        PrintWriter outputFile = new PrintWriter("Data.txt");
        outputFile.println(list);
        //outputFile.println();
        outputFile.close();
    }
    else if( inputFile.hasNext()) {
        // At this point, you there the remaining data cannot be safely cast to an Integer.
    }
    else {
       // Not enough data to process.
    }
}

public class TravelInfo {
    private int speed;
    private int distance;
    private int time;

    public TravelInfo(int s, int d, int t) {
        speed = s;
        distance = d;
        time = t;
    }
    public int calcTime(int time) {
        time = distance/speed;
        return time;
    }

    // Override toString() instead of using the default Object.toString()
    @Override
    public String toString() {
        // Return whatever 'String' you want
        return String.format( "%d, %d, %d", speed, distance, time );
    }
}
0 голосов
/ 02 мая 2019

Вы должны сделать еще несколько проверок и никогда не использовать методы nextXXX() вслепую - что-то вроде

while(true)
{
    if (!inputFile.hasNextInt()) {
       System.err.println("Reading file failed - invalid format (s)");
       break;
    }
    int s = inputFile.nextInt();
    System.out.println("Reading s = " + s);

    if (!inputFile.hasNextInt()) {
       System.err.println("Reading file failed - invalid format (d)");
       break;
    }
    int d = inputFile.nextInt();
    System.out.println("Reading d = " + d);


    if (!inputFile.hasNextInt()) {
       System.err.println("Reading file failed - invalid format (t)");
       break;
    }
    int t = inputFile.nextInt();
    System.out.println("Reading t = " + t);
    // Do some stuff
}

Таким образом, вы избежите NoSuchElementException, и приложение будет корректно завершено.Вы получите выходные данные отладки на консоли.Он также распечатает, что именно было прочитано из файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...