Классы в java

Так что я принял все отзывы и информацию и потратил немало времени, пытаясь поработать над своим кодом перед отправкой. Вот изменения, которые у меня есть:

import java.util.*;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

class Automobiles {
    String make;
    String model;
    String color;
    int year;
    int mileage;
    int i;
    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMileage() {
        return mileage;
    }

    public void setMileage(int mileage) {
        this.mileage = mileage;
    }

    public void setMake(String make) {
        this.make = make;
    }

public Automobiles() {
    make = "";
    model = "";
    color = "";
    year = 0;
    mileage = 0;    
    }

    public void Inventory(String make, String model, String color, int year, int mileage) {
        System.out.println("Car is: " + make + " " + model + " " + color + " " + year + " " + mileage);
    }

        String getMake() {
        return make;
    }


}

public class AutomobileInventory {

    public static void main(String[] args)
    {
        Automobiles[] carInventory = new Automobiles[15];
        int i;
        String fileName = "out.txt";
        boolean quit = false;
        String quit1 = "No";

        Scanner scnr = new Scanner(System.in);

        while (quit1 != "Yes") {
        for(i=0; i<carInventory.length; i++) {
            carInventory[i] = new Automobiles();
            System.out.println("");

            System.out.println("Please Enter the make of the vehicle: ");
            carInventory[i].make = scnr.nextLine();

            System.out.println("Please Enter the model of the vehicle: ");
            carInventory[i].model = scnr.nextLine();

            System.out.println("Please Enter the vehicle color: ");
            carInventory[i].color = scnr.nextLine();

            System.out.println("Please Enter the year of the vehicle: ");
            carInventory[i].year = scnr.nextInt();

            System.out.println("Please Enter the vehicle's mileage: ");
            carInventory[i].mileage = scnr.nextInt();

            System.out.println("Are you done? Yes or No");
            quit1 = scnr.nextLine();

            }
        } 

        for(i=0; i<carInventory.length; i++)
        System.out.println(carInventory[i].make + " " + carInventory[i].model + " " + carInventory[i].color + " " + carInventory[i].year + " " + carInventory[i].mileage);

         try {
            PrintWriter outputstream = new PrintWriter(fileName);
            outputstream.println(carInventory[i].make + " " + carInventory[i].model + " " + carInventory[i].color + " " + carInventory[i].year + " " + carInventory[i].mileage);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

У меня возникла проблема, заключающаяся в том, что по мере завершения цикла первый и второй экземпляры объединяются, и это не позволяет мне каждый раз вводить строку для Make. Кроме того, когда я печатал в файл, он печатал только один экземпляр, а не все экземпляры. Любая помощь приветствуется.

Вы забыли инициализировать переменную выхода.

Kushagra Misra 07.07.2018 05:36

Собственно, вы тоже не инициализировали automobiles. Есть два метода autmobileInventory, и вы не вызываете с помощью того, который инициализирует automobiles. Просмотрите разницу между статическими методами и методами экземпляра, а также то, как Java решает, какие вызовы вызывать.

Stephen C 07.07.2018 06:32

В вашем коде много разных проблем. Я настоятельно рекомендую вам остановиться и вернуться к некоторым базовым руководствам по Java, чтобы узнать, как объявлять классы и создавать экземпляры объектов этих классов.

Jim Garrison 07.07.2018 08:16

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

Jeremy Sawyer 08.07.2018 09:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
88
3

Ответы 3

Как упоминалось в @kushagra, вам необходимо инициализировать переменную выхода. В настоящее время он равен нулю, поэтому NullPointerException (пытается вызвать метод, который еще не существует для вашей переменной)

Однако один совет относительно вашей переменной выхода: я бы изменил ее на логическое значение, поскольку все, что вам нужно, это истина / ложь. Таким образом, вам не нужно сравнивать строки. Это выглядело бы примерно так:

boolean quit = false;
...

do { /* loop stuff */ }
while(quit != true);

Затем в вашем цикле do вы можете добавить логику для изменения вашей переменной quit на true, когда ваш пользователь готов выйти.

Что касается вашего инвентаря, я бы не стал использовать массив, если вам не нужно; Я бы использовал список (массивы не могут изменять размер, тогда как списки могут). Затем вместо использования цикла for (вы уже выполняете цикл с помощью do-while - это делает его немного избыточным) вы можете добавить новый автомобиль в свой список, где он в настоящее время закомментирован. Это выглядело бы примерно так:

private static List<Automobile> automobiles;
...

automobiles.add(new Automobile(make, model, Color, year, mileage));

ОБНОВИТЬ

Ваш код довольно беспорядочный - убедитесь, что вы согласны с табуляцией / интервалом и т. д. Вы также должны придумать чистый способ организации своих методов. Например, мне нравится хранить все мои геттеры и сеттеры вместе с конструкторами прямо под свойствами класса. В нижней части класса я предпочитаю хранить общие методы класса, переопределенные методы и т. д.

Одна проблема, связанная с вашим кодом, связана с вашим основным (...); старайтесь не зацикливаться внутри циклов, если вам это не нужно (очевидно, всегда есть исключения, такие как многомерные массивы, обход «сеток» и т. д.) - это может немного замедлить выполнение (проверьте нотацию Big O - это довольно хорошая статья: https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/). Это также поможет вам отслеживать, когда ваш цикл закрывается. Запись вашего файла происходит только один раз, потому что вы не зацикливаетесь (здесь вам может помочь последовательный отступ / интервал).

Еще пара быстрых советов: всякий раз, когда вы повторно используете значение, создавайте для него переменную. Вы делали это несколько раз, но было несколько случаев, когда вы могли использовать переменную (помните: вызовы методов требуют времени для выполнения, поэтому ограничение избыточных вызовов ускорит вашу программу). Кроме того, не бойтесь переопределить метод toString () в своих классах - класс cars на самом деле действительно хороший вариант использования.

Я старался не давать вам всех ответов, но я немного переписал ваш код, чтобы помочь вам начать работу:

import java.util.ArrayList;
import java.util.List;
import java.io.FileNotFoundException;
import java.io.PrintWriter;


class Automobiles {
    String color = "";
    String make = "";
    String mileage = "";
    String model = "";
    String year = "";


    // -------------------- getters -------------------- //
    public String getColor() { return color; }
    public String getMake() { return make; }
    public String getModel() { return model; }
    public String getMileage() { return mileage; }
    public String getYear() { return year; }


    // -------------------- setters -------------------- //
    public void setColor(String color) { this.color = color; }
    public void setMake(String make) { this.make = make; }
    public void setMileage(String mileage) { this.mileage = mileage; }
    public void setModel(String model) { this.model = model; }
    public void setYear(String year) { this.year = year; }


    @Override
    public String toString() {
        return year + " " + model + " " + make;
    }// end toString()
}// end class Automobiles


public class AutomobileInventory {

    public static void main(String[] args) {
        List<Automobiles> carInventory = new ArrayList<>();
        String fileName = "out.txt";
        boolean quit = false;

        Scanner scnr = new Scanner(System.in);
        do {
            Automobiles car = new Automobiles();

            System.out.println("Please Enter the year of the vehicle: ");
            car.setYear(scnr.nextLine());

            System.out.println("Please Enter the make of the vehicle: ");
            car.setMake(scnr.nextLine());

            System.out.println("Please Enter the model of the vehicle: ");
            car.setModel(scnr.nextLine());

            System.out.println("Please Enter the vehicle color: ");
            car.setColor(scnr.nextLine());

            System.out.println("Please Enter the vehicle's mileage: ");
            car.setMileage(scnr.nextLine());

            carInventory.add(car);

            System.out.println("Are you done? Yes or No");
            quit = "yes".equals(scnr.nextLine().trim().toLowerCase()) ? true : false;
        } while(quit == false);// end do-while-loop

        int numCars = carInventory.size();
        for(int i = 0; i < numCars; i++) {
            String currentCar = carInventory.get(i).toString();
            System.out.println(currentCar);

            try {
                PrintWriter outputstream = new PrintWriter(fileName);
                outputstream.println(currentCar);
            } catch( FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }// end try-catch
        }// end for-loop
    }// end main(String[] args)
}// end class AutomobileInventory

Поскольку вы не инициализируете переменную покидать и используете цикл do-while, цикл выполняется один раз без проверки того, покидать = "quit". Это приводит к тому, что цикл выполняется нормально, но на второй итерации происходит сбой.

Если мы исследуем структуру выполнения цикла:

1) Печать «Модель автомобиля:»
2) Печать "Марка автомобиля:"
3) Печать «Цвет автомобиля:»
4) Печать «Автомобиль Год:»
5) Печать «Пробег автомобиля:»
6) Выполнить для loop
7) Оцените, действительно ли quit == "quit"
8) Печать «Модель автомобиля»
9) И т.д. ...

Когда шаг №7 пытается оценить равенство, он фактически выполняет это сравнение:

!null.equalsIgnoreCase("quit"));

Поскольку в приведенном выше коде переменная покидать никогда не инициализировалась и по-прежнему имеет значение null. Два приведенных ниже фрагмента кода по сути эквивалентны:

// Initialization without assignment:
String quit;

// Explicit initialization to null:
String quitTwo = null;

// Output
print quit
// >> NullPointerException

print quitTwo
// >> NullPointerException

Ваш класс Automobile в порядке.


В вашем классе automobileInventory вы инициализируете статический член данных нестатическим методом (проверьте функцию, в которой вы инициализируете массив automobiles).

Вы можете просто инициализировать его там, где вы его объявляете, то есть:

private static Automobile[] automobiles = new Automobile[ INVENTORY_SIZE ];

Другой способ - инициализировать его в блоке static, то есть:

private static Automobile[] automobiles;

static {
    automobiles = new Automobile[ INVENTORY_SIZE ];
}

Другой способ - инициализировать его в вашей функции перед циклом.


В вашем контрольном цикле вы проверяете условие выхода для переменной quit, но вы ничего ей не назначаете. Вам нужно получить значение от пользователя, намеревается ли он / она уйти или нет.

Вот пример:

String quit; // In your function; not a class member

do {

   // ... Rest of your code ...

    System.out.println("Do you want to quit [Yes/No]? ");
    quit = scnr.nextLine();
}
while ( !quit.equalsIgnoreCase("yes") );

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

String quit; // In your function; not a class member

int i = 0;

do {

   // ... Rest of your code ...

    if ( i < INVENTORY_SIZE ) {
        automobiles[i] = new Automobile(make, model, color, year, mileage);
        i++;
    }
    else {
        // ... Display error message here that array is full ...
        // ... You can then break this loop to exit if you want to ...
        break;
    }

    System.out.println("Do you want to quit [Yes/No]? ");
    quit = scnr.nextLine();
}
while ( !quit.equalsIgnoreCase("yes") );

Вот ваш рабочий код: https://ideone.com/JqX9Y9

Некоторые строки прокомментированы для моего собственного тестирования. Вы можете легко сопоставить изменения с этим ответом и самостоятельно выяснить, что происходит.


Удачи! Удачного кодирования!

Другие вопросы по теме