Java реализует обработку исключений - PullRequest
0 голосов
/ 21 марта 2010

Я пытаюсь реализовать исключение OutOfStockException для случаев, когда пользователь пытается купить больше товаров, чем доступно. Я не уверен, что моя реализация верна. Для вас это нормально?

public class OutOfStockException extends Exception {


    public OutOfStockException(){
        super();
    }

    public OutOfStockException(String s){
        super(s);
    }
}

Это класс, в котором мне нужно его протестировать:

import javax.swing.JOptionPane;

public class SwimItems {
    static final int MAX = 100;


    public static void main (String [] args)
    {
        Item [] items = new Item[MAX];
        int numItems;

        numItems = fillFreebies(items);
        numItems += fillTaxable(items,numItems);
        numItems += fillNonTaxable(items,numItems);

        sellStuff(items, numItems);
    }

    private static int num(String which) {
        int n = 0;
        do {
                       try{
            n=Integer.parseInt(JOptionPane.showInputDialog("Enter number of "+which+" items to add to stock:"));
                       }
                       catch(NumberFormatException nfe){
                           System.out.println("Number Format Exception in num method");
                       }
        } while (n < 1 || n > MAX/3);
        return n;
    }

    private static int fillFreebies(Item [] list)
    {
        int n = num("FREEBIES");
        for (int i = 0; i < n; i++)
                    try{
            list [i] = new Item(JOptionPane.showInputDialog("What freebie item will you give away?"),
            Integer.parseInt(JOptionPane.showInputDialog("How many do you have?")));
                    }
                    catch(NumberFormatException nfe){
                        System.out.println("Number Format Exception in fillFreebies method");
                    }
                    catch(ArrayIndexOutOfBoundsException e){
                        System.out.println("Array Index Out Of Bounds Exception in fillFreebies method");
                    }

        return n;
    }

    private static int fillTaxable(Item [] list, int number)
    {
        int n = num("Taxable Items");
        for (int i = number ; i < n + number; i++)
                    try{
            list [i] = new TaxableItem(JOptionPane.showInputDialog("What taxable item will you sell?"),
                Double.parseDouble(JOptionPane.showInputDialog("How much will you charge (not including tax) for each?")),
                    Integer.parseInt(JOptionPane.showInputDialog("How many do you have?")));
                    }
                    catch(NumberFormatException nfe){
                        System.out.println("Number Format Exception in fillTaxable method");
                    }
                    catch(ArrayIndexOutOfBoundsException e){
                        System.out.println("Array Index Out Of Bounds Exception in fillTaxable method");
                    }

        return n;
    }


    private static int fillNonTaxable(Item [] list, int number)
    {
        int n = num("Non-Taxable Items");
        for (int i = number ; i < n + number; i++)
                    try{
            list [i] = new SaleItem(JOptionPane.showInputDialog("What non-taxable item will you sell?"),
                    Double.parseDouble(JOptionPane.showInputDialog("How much will you charge for each?")),
                    Integer.parseInt(JOptionPane.showInputDialog("How many do you have?")));
                    }
                    catch(NumberFormatException nfe){
                        System.out.println("Number Format Exception in fillNonTaxable method");
                    }
                    catch(ArrayIndexOutOfBoundsException e){
                        System.out.println("Array Index Out Of Bounds Exception in fillNonTaxable method");
                    }

        return n;
    }


    private static String listEm(Item [] all, int n, boolean numInc)
    {
        String list = "Items:  ";
        for (int i = 0; i < n; i++)
        {
                    try{
            list += "\n"+ (i+1)+".  "+all[i].toString() ;
            if (all[i] instanceof SaleItem) list += " (taxable) ";
            if (numInc) list += " (Number in Stock: "+all[i].getNum()+")";
                    }
                    catch(ArrayIndexOutOfBoundsException e){
                        System.out.println("Array Index Out Of Bounds Exception in listEm method");
                    }
                    catch(NullPointerException npe){
                        System.out.println("Null Pointer Exception in listEm method");
                    }

        }
        return list;
    }



    private static void sellStuff (Item [] list, int n) {

        int choice;
        do {
                    try{
            choice = Integer.parseInt(JOptionPane.showInputDialog("Enter item of choice:  "+listEm(list, n, false)));
                    }
                    catch(NumberFormatException nfe){
                        System.out.println("Number Format Exception in sellStuff method");
                    }

        }while (JOptionPane.showConfirmDialog(null, "Another customer?")==JOptionPane.YES_OPTION);

        JOptionPane.showMessageDialog(null, "Remaining "+listEm(list, n, true));

        }

}

Ответы [ 4 ]

4 голосов
/ 21 марта 2010

Реализация выглядит отлично; вам не нужно много делать в классе исключений. Вы могли бы подумать о добавлении членов для того, что было, что было на складе, сколько было запрошено, и сколько было на складе, когда был сделан запрос, чтобы код, перехватывающий исключение, имел доступ к этой информации. Так, например, здесь у меня есть код товара:

public class OutOfStockException extends Exception {

    private int stockCode;

    public OutOfStockException(int stockCode){
        super();
        this.stockCode = stockCode;
    }

    public OutOfStockException(String s){
        super(s);
        this.stockCode = stockCode;
    }

    public int getStockCode() {
        return this.stockCode;
    }
}

Вы можете создать такой файл:

throw new OutOfStockException(StockCodes.WIDGET, "Out of widgets");

Но это зависит от вас, и в этот момент это просто классный дизайн, как и все остальное.

Много раз, с такими вещами, я только включает конструкторы с отдельными частями, а затем сам класс генерирует сообщение для базового сообщения Exception getMessage. Итак:

public class OutOfStockException extends Exception {

    private int stockCode;

    public OutOfStockException(int stockCode){
        super("Out of " + StockCodes.getDescription(stockCode));
        this.stockCode = stockCode;
    }

    public int getStockCode() {
        return this.stockCode;
    }
}

// Throwing one:
throw new OutOfStockException(StockCodes.WIDGETS);

Но опять же, это просто классный дизайн в этот момент.

Все это в стороне, и это немного не по теме, но отсутствие товара на складе кажется мне нормальной, а не исключительной ситуацией; Вы уверены, что исключение действительно правильный способ его моделирования?

1 голос
/ 21 марта 2010

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

0 голосов
/ 21 марта 2010

Ваше исключение выглядит нормально.

Я не уверен насчет ваших SaleItem и TaxableItem классов.

if (all[i] instanceof SaleItem) list += " (taxable) ";

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

0 голосов
/ 21 марта 2010

Да, ваше исключение правильно реализовано.

Тем не менее, я бы предложил включить в него дополнительную информацию:

  • рассматриваемый товар
  • количество попыток на заказ
  • фактическое количество оставшихся предметов

например, если в товаре "Велосипед" осталось 2 предмета, а один пытается заказать три, исключение будет сгенерировано и сгенерировано как

throw new OutOfStockException(product, requestedQuantity, actualQuantity)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...