Для l oop не инициируется в методе - PullRequest
0 голосов
/ 12 января 2020

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

Проблема в том, что когда я вызываю crate.fillCrate(); или crate.emptyCrate();, в консоли ничего не появляется, а когда я вызываю crate.crateInfo();, в консоли появляется следующее:

A nice crate of Heineken It contains 24 slots slots: are filled. slots: are empty.

Полагаю, это означает, что мои циклы for не запускаются, но я понятия не имею, почему ...

Мой основной класс:

public class Main {

    public static void main(String[] args) {
        Crate crate = new Crate(24, "Heineken");
    }
}

Мой класс ящиков:

public class Crate {
    private int crateSize;
    private Bottle[] bottles = new Bottle[crateSize];
    public String brand = null;

    public Crate(int crateSize, String brand) {
        this.crateSize = crateSize;
        this.brand = brand;
    }

    public void fillCrate(){
        for(int i = 0; i < bottles.length; i++) {
            if(bottles[i] == null && !bottles[i].getSpotInfo()) {
                bottles[i] = new Bottle(true);
                System.out.println("Spot " + (i+1) + " is filled.");
            } else {
                System.out.println("Spot " + (i+1) + " was already full");
            }
        }
    }

    public void emptyCrate() {
        for(int i = 0; i < bottles.length; i++) {
            if(bottles[i] != null && bottles[i].getSpotInfo()) {
                bottles[i].makeSpotEmpty();
                System.out.println("Spot " + (i+1) + " is empty."); 
            } else {
                System.out.println("Spot " + (i+1) + " was already empty");
            }
        }
    }

    public void crateInfo() {
        System.out.println("A nice crate of " + brand);
        System.out.println("It contains " + crateSize + " slots");
        System.out.print("slots: ");
        for(int i = 0; i < bottles.length; i++) {
            if(bottles[i] != null && bottles[i].getSpotInfo()) {
                System.out.print((i+1));
            }
        }
        System.out.println(" are filled.");
        System.out.print("slots: ");
        for(int c = 0; c < bottles.length; c++) {
            if(bottles[c] != null && !bottles[c].getSpotInfo()) {
                System.out.print((c+1));
            }
        }
        System.out.println(" are empty.");
    }
}

И мой Bottle класс:

public class Bottle {
    private boolean occupiesSpot = false;

    public Bottle(boolean occupiesSpot) {
        this.occupiesSpot = occupiesSpot;
    }

    public void makeSpotEmpty() {
        occupiesSpot = false;       
    }

    public boolean getSpotInfo() {
        return occupiesSpot;
    }
}

1 Ответ

3 голосов
/ 12 января 2020
    private int crateSize;
    private Bottle[] bottles = new Bottle[crateSize];

бутылки получают размер 0, так как crateSize еще не инициализирован, вместо этого вы должны сделать

    public Crate(int crateSize, String brand) {
        this.crateSize = crateSize;
        this.brand = brand;
        this.bottles = new Bottle[crateSize];
    }

, а также

if (bottles[i] == null && bottles[i].getSpotInfo())

эта строка вызовет исключение NullPointerException если bottle равно нулю, потому что вы не можете вызвать метод (getSpotInfo) для нулевого объекта. Спасибо за @ Turing85 за то, что указал на это.

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