Попытка остановить цикл от бесконечного зацикливания, но также не допустить его «прерывания» при каждом запуске - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть цикл, который читает число строк в текстовом файле при запуске программы, а затем, в зависимости от количества строк, сохраняет это количество объектов в новом массиве (Vehicle []) (максимум 4).

public boolean addVehicle(Vehicle[] Honda) throws FileNotFoundException
{
    Scanner reader = new Scanner(file);
    String strLine = "";

        if(canAddVehicle() == true)
        {

        for(int i = 0; i < vehicles.length;i++)
        {
            System.out.println("This file is: " + file);
            int counter = 0;

            if(vehicles[i] == null)
            {
                try{
                    // Open the file that is the first 
                    // command line parameter
                    FileInputStream fstream = new FileInputStream(this.file);

                    // Get the object of DataInputStream
                    DataInputStream in = new DataInputStream(fstream);
                        BufferedReader br = new BufferedReader(new InputStreamReader(in));

                    //Read File Line By Line
                    while ((strLine = br.readLine()) != null)   {

                        //Declare objects inside the array.
                        Honda[counter] = new Vehicle();
                        Honda[counter].readRecord(reader);
                        vehicles[counter] = Honda[counter];
                        counter++;

                    }
                    strLine = "";

                    //Close the input stream and scanner
                    reader.close();
                    in.close();
                    }catch (Exception e){//Catch exception if any
                      System.err.println("Error: " + e.getMessage());
                    }
                  }
                break;
            }
        }
            return true;
        }

Часть, с которой у меня возникли проблемы, это строка:

if(vehicles[i] == null)

После запуска программы пользователи могут добавлять новые автомобили в массив.Если вы просматриваете код построчно, вы можете видеть, что он начинается с i = 0, и, скажем, при первом запуске программы он обнаружил 2 строки значений, поэтому он сохранил 2 объекта в массиве.Значения 0 и 1 взяты.Это означает, что когда пользователь идет, чтобы добавить новый Автомобиль, он пропустит if(vehicles[i] == null), потому что spot [0] не является нулевым, он содержит значения с начала программы.break; и выводит вас из метода, не возвращаясь назад к циклу for, чтобы проверить, есть ли какие-либо другие нулевые значения в массиве.Что я мог здесь сделать?

Ответы [ 6 ]

1 голос
/ 07 декабря 2011

Ваш код действительно не имеет большого смысла.Исходя из того, что я понимаю в описании вашей проблемы, приведенный ниже код может или не может быть тем, что вы хотите сделать:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class VehicleList {

    public class Vehicle {
        private final String brand;
        private final String make;
        private final String year;

        public Vehicle(String[] args) {
            if (args.length < 3) {
                throw new IllegalArgumentException("Too few args: " + args.length);
            }
            this.brand = args[0];
            this.make = args[1];
            this.year = args[2];
        }

        @Override
        public String toString() {
            return String.format("%s %s %s", year, brand, make);
        }
    }

    public List<Vehicle> readVehicles(String fileName) throws IOException {
        List<Vehicle> vehicles = new ArrayList<Vehicle>();
        System.out.println(String.format("Reading vehicles from %s:", fileName));
        readVehicles(vehicles, new Scanner(new File(fileName)), false);
        System.out.println(String.format("Reading vehicles from user:"));
        readVehicles(vehicles, new Scanner(System.in), true);
        return vehicles;
    }

    private void readVehicles(List<Vehicle> vehicles, Scanner scanner, boolean skipLineCheck) {
        int count = 0;
        while (skipLineCheck || scanner.hasNextLine()) {
            String[] tokens = scanner.nextLine().split("\\s+");
            if (tokens.length < 3) {
                break;
            }
            vehicles.add(new Vehicle(tokens));
            count++;
        }
        scanner.close();
        System.out.println(String.format("Read %s vehicles", count));
    }

    public static void main(String[] args) throws IOException {
        VehicleList instance = new VehicleList();
        List<Vehicle> vehicles = instance.readVehicles("vehicles.txt");
        System.out.println("Read the following vehicles:");
        System.out.println(Arrays.toString(vehicles.toArray()));
    }
}

Логический skipLineCheck необходим, чтобы сканер не мог прочитать последнюю строку в файлебросая NoSuchElementException.Для пользовательского ввода мы не хотим делать эту проверку, потому что он заставляет пользователя давать дополнительный RETURN, чтобы завершить ввод.

Чтобы запустить это, вам нужно создать файл с именем «Vehicles.txt» вваш рабочий каталог, например, со следующим содержимым:

Volvo Station 2008
Audi A4 2009
Honda Civic 2009
Toyota Prius 2008

Тестовый прогон дает вывод, как показано ниже:

Reading vehicles from vehicles.txt
Read 4 vehicles
Reading vehicles from user
Nissan Micra 2002
BMW cabriolet 1996

Read 2 vehicles
Read the following vehicles: 
[2008 Volvo Station, 2009 Audi A4, 2009 Honda Civic, 2008 Toyota Prius, 2002 Nissan Micra, 1996 BMW cabriolet]
1 голос
/ 07 декабря 2011

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

Питер Лоури (Peter Lawrey) дал хороший комментарий по использованию отладчика, после того как выяснил, что вы делаете с программой, если она не работает так, как вы ожидали, с помощью отладчика (очень легко в большинстве IDE) вы можете выполнить свою программу, смотрите каждое действие и проверяйте значения переменных на каждом шаге.

1 голос
/ 07 декабря 2011

две вещи, а. переключите перерыв, чтобы продолжить, и поместите перерыв в нужном вам месте.

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

0 голосов
/ 08 декабря 2011

Спасибо за ответы всем.Я программировал около 12 часов, и мой разум был просто мертв, когда я задал вопрос.Не уверен, что я делал.Я завершил свой код с этим:

public boolean addVehicle(Vehicle[] Honda) throws FileNotFoundException
{
    boolean found = false;
    int position = 0;
        if(canAddVehicle() == true)
        {
            for(int i = 0; i < vehicles.length && !found; i++)
            {
                if(vehicles[i] == null)
                {
                    position = i;
                    found = true;
                }
            }

               Scanner reader = new Scanner(file);
               while(reader.hasNext())
               {
                   Honda[position] = new Vehicle();
                   Honda[position].readRecord(reader);
                   vehicles[position] = Honda[position];
                   position++;

               }
                reader.close();
                return true;
        }
        return false;
}
0 голосов
/ 07 декабря 2011

Исходя из этого утверждения: это приводит к разрыву;и выводит вас из метода, не возвращаясь назад к циклу for, чтобы проверить, есть ли какие-либо другие нулевые значения в массиве.

звучит так, как будто вы хотите продолжить, где разрыв.* break приведет к разрыву цикла for, в то время как continue вызовет чтение кода в цикле (сверху вниз) с увеличением i на 1 (в данном случае)

0 голосов
/ 07 декабря 2011

Почему у вас вообще есть перерыв - он просто заставит его делать именно то, что вы описываете.Убери его и все будет хорошо.

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