Так что я принял все отзывы и информацию и потратил немало времени, пытаясь поработать над своим кодом перед отправкой. Вот изменения, которые у меня есть:
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. Кроме того, когда я печатал в файл, он печатал только один экземпляр, а не все экземпляры. Любая помощь приветствуется.
Собственно, вы тоже не инициализировали automobiles. Есть два метода autmobileInventory, и вы не вызываете с помощью того, который инициализирует automobiles. Просмотрите разницу между статическими методами и методами экземпляра, а также то, как Java решает, какие вызовы вызывать.
В вашем коде много разных проблем. Я настоятельно рекомендую вам остановиться и вернуться к некоторым базовым руководствам по Java, чтобы узнать, как объявлять классы и создавать экземпляры объектов этих классов.
Спасибо. Я сделал несколько изменений после того, как сделал все возможное, чтобы просмотреть свои заметки и убедиться, что провожу больше времени с объектами и классами. Любая другая помощь будет принята с благодарностью.




Как упоминалось в @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
Некоторые строки прокомментированы для моего собственного тестирования. Вы можете легко сопоставить изменения с этим ответом и самостоятельно выяснить, что происходит.
Удачи! Удачного кодирования!
Вы забыли инициализировать переменную выхода.