вложение попробовать и поймать в петле - PullRequest
0 голосов
/ 21 мая 2018

У нас есть практический тест на Java о магазине IceCream.Мы должны обрабатывать исключения в случае, если больше нет запасов.Код из приложения ниже работает нормально.Исключения обрабатываются должным образом.

public class IceCreamApp2 {
    public static void main(String[] args) {
        Prijslijst priceList2 = new Prijslijst(2, 5, 8);

        Stock stock = new Stock(1, 8, 2, 1);

        IceCreamCar iceCar = new IceCreamCar(priceList2, stock);


        try {
            Eatable[] eatCar = {
                    iceCar.orderCone(new Cone.Flavor[]{Cone.Flavor.CHOCOLATE, Cone.Flavor.BANANA, Cone.Flavor.VANILLA}),
                    iceCar.orderCone(new Cone.Flavor[]{Cone.Flavor.VANILLA, Cone.Flavor.VANILLA}),
                    iceCar.orderMagnum(Magnum.MagnumType.ROMANTICSTRAWBERRIES),
                    iceCar.orderMagnum(Magnum.MagnumType.ALPINENUTS),
                    iceCar.orderIceRocket()
            };
            for (int i = 0; i < eatCar.length; i++) {
                eatCar[i].eat();
            }
            System.out.println(iceCar.getProfit());
        } catch (NoMoreIceCreamException noMoreIce) {
            System.out.println("No More Ice To sell... Beat it!!");
            System.out.println("Message: " + noMoreIce.getMessage());
            System.out.println("Cause: " + noMoreIce.getCause());
        }
        System.out.println(iceCar.getProfit());
    }
}

Однако эта логика ошибочна, так как при появлении исключения она перестает считать остаток порядка.Поэтому Magnums и Icerockets, несмотря на то, что они есть в наличии, не учитываются в прибыли.Для этого мы знаем, что нам нужно перебрать таблицу «Eatable».Но он не работает и завершает работу с кодом 1, за исключением:

public class IceCreamApp2 {
    public static void main(String[] args) {
        Prijslijst priceList2 = new Prijslijst(2, 5, 8);

        Stock stock = new Stock(1, 8, 2, 1);

        IceCreamCar iceCar = new IceCreamCar(priceList2, stock);

        Eatable[] eatCar = {
                iceCar.orderCone(new Cone.Flavor[]{Cone.Flavor.CHOCOLATE, Cone.Flavor.BANANA, Cone.Flavor.VANILLA}),
                iceCar.orderCone(new Cone.Flavor[]{Cone.Flavor.VANILLA, Cone.Flavor.VANILLA}),
                iceCar.orderMagnum(Magnum.MagnumType.ROMANTICSTRAWBERRIES),
                iceCar.orderMagnum(Magnum.MagnumType.ALPINENUTS),
                iceCar.orderIceRocket()
        };

        for (int i = 0; i < eatCar.length; i++) {
            try {
                eatCar[i].eat();
            } catch (NoMoreIceCreamException noMoreIce) {
                System.out.println("No More Ice To sell... Beat it!!");
                System.out.println("Message: " + noMoreIce.getMessage());
                System.out.println("Cause: " + noMoreIce.getCause());
            }

        }
        System.out.println(iceCar.getProfit());
    }
}

Любая подсказка, что может быть не так?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Хорошо, значит, проблема решена.На самом деле решение состоит в том, чтобы поместить try и catch в каждый из элементов orderCone, orderMagnum и т. Д., Чтобы исключения обрабатывались правильно.

0 голосов
/ 21 мая 2018

Вот трассировка стека:

Preparing your Balls on a cone
Exception in thread "main" Seller.NoMoreIceCreamException: No more Balls or Cones
    at Seller.IceCreamCar.prepareCone(IceCreamCar.java:39)
    at Seller.IceCreamCar.orderCone(IceCreamCar.java:30)
    at App.IceCreamApp2.main(IceCreamApp2.java:18)

Process finished with exit code 1

@ Andrew S: условие уже обработано в классе «IceCreamCar».Короче говоря:

public class IceCreamCar implements IceCreamSeller {

    // Instance Variables
    Prijslijst priceList;
    Stock stock;
    private double profit;


    // Constructor
    public IceCreamCar() {

    }

    public IceCreamCar(Prijslijst priceList, Stock stock) {
        this.priceList = priceList;
        this.stock = stock;
    }


    // Methods
    // Order Cone
    @Override
    public Cone orderCone(Cone.Flavor[] balls) {
        this.prepareCone(balls);
        return new Cone(balls);
    }

//    // Prepare Cone
    private Cone prepareCone(Cone.Flavor[] balls) {
        int countCones = 1;

        if (stock.getCones() < 0 || stock.getBalls() < 0) {
            throw new NoMoreIceCreamException("No more Balls or Cones");
        } else {
            for (int i = 0; i < balls.length; i++) {
                stock.setBalls(stock.getBalls() - balls.length);
                profit += priceList.getBallPrice();
            }
            System.out.println("Preparing your Balls on a cone");
            countCones++;
            stock.setCones(stock.getCones() - countCones);
        }
        return new Cone(balls);
    }

спасибо вам обоим за ответ:)

...