0

我的头衔并不是最好的,但我不确定如何命名我正在尝试做的事情。无论哪种方式,我都有一个案例切换...

    switch (input) {
        case "A":
            Item item = new Item();
            System.out.print("Enter a barcode: ");
            barCode = scan.nextLine();
            item.setBarCode(barCode);

            if (store.addItem(barCode)) {
                System.out.println(store.stockedItems.get(barCode).getProductName()
                        + " has been added to the store's inventory");
            }

            else {
                item.setQuantity(1);
                System.out.print("Enter the item's name: ");
                productName = scan.nextLine();
                productName = productName.toLowerCase();
                item.setProductName(productName);
                store.stockedItems.put(barCode, item);

                System.out.println(store.stockedItems.get(barCode).getProductName()
                        + " has been added to the store's inventory");
            }
            break;
    }

这只是一种情况。这样做是当用户选择 A 将对象添加到我的数据结构中时,它会确定提到的条形码是否已在使用中。

如果是,它只会增加我的数据结构中对象的数量。

如果条码未使用并检查其有效性后。它将提示用户输入对象的名称,然后继续将其添加到我的数据结构中。

现在的问题是在我输入条形码字符串并在其各自的对象类中调用 setter 函数之后:

public void setBarCode(String code) {
    if (!code.matches("[0-9]+") || code.length() != 12) {
        System.out.println("The barcode entered is not in valid format.  Entry ignored.");
    } else {
        barcode = code;
    }
}

这个函数只是确保它是数字和 12 个字符长。如果不是,我想忽略该条目并从菜单重新开始。我遇到的问题是,即使条形码无效且未设置,程序也会继续询问项目名称。

如何跳过所有这些并再次打印菜单?

4

2 回答 2

2

有两种策略可以解决这个问题:

  1. 将条形码有效性检查移到setBarCode方法之外并首先进行该测试(或修改setBarCode以返回boolean指示条形码是否有效的)。
  2. 修改addItem以返回比 a 更具信息性的内容boolean,以便您可以区分三种情况:坏条形码;成功;失败,因为它需要更多信息。
于 2013-04-23T18:11:47.147 回答
1

settersetBarCode()应该 (a) 成功,或 (b) 指示失败(可能使用 an,IllegalArgumentException因为我们在 Java 中)而不是静默失败。如果您要使用IllegalArgumentException,则此代码会很好地工作:

boolean acceptable;
try {
    item.setBarCode(barCode);
    acceptable = true;
}
catch(IllegalArgumentException e) {
    acceptable = false;
}

if(acceptable) {
        if(store.addItem(barCode)){
            System.out.println(store.stockedItems.get(barCode).getProductName() + " has been added to the store's inventory");
        }
        else {
            item.setQuantity(1);
            System.out.print("Enter the item's name: ");
            productName = scan.nextLine();
            productName = productName.toLowerCase();
            item.setProductName(productName);
            store.stockedItems.put(barCode, item);

            System.out.println(store.stockedItems.get(barCode).getProductName() + " has been added to the store's inventory");
        }
}

break;

但是,我建议您不要依赖 setter 的失败来确保正确性。从风格上讲,它“闻起来很有趣”。相反,我会将测试放在另一个(可能static)方法中,在调用 setter之前进行测试并做出相应的反应,然后assert在 setter 中放入一个。所以,更像这样:

// Somewhere up in your code -- Sorry, fixed up your regex
private static final Pattern BARCODE=Pattern.compile("^\\d{12}$");
public static boolean isValidBarcode(String candidate) {
    return BARCODE.matcher(candidate).matches();
}

// Now your "real" code
case "A":

    Item item = new Item();
    System.out.print("Enter a barcode: ");
    barCode = scan.nextLine();
    if(isValidBarCode(barCode)) {
        item.setBarCode(barCode);
        if(store.addItem(barCode)) {
            System.out.println(store.stockedItems.get(barCode).getProductName() + " has been added to the store's inventory");
        }
        else {
            item.setQuantity(1);
            System.out.print("Enter the item's name: ");
            productName = scan.nextLine();
            productName = productName.toLowerCase();
            item.setProductName(productName);
            store.stockedItems.put(barCode, item);

            System.out.println(store.stockedItems.get(barCode).getProductName() + " has been added to the store's inventory");
        }
    }
    else {
        System.out.println("That's not a valid bar code.");
    }
    break;

// And, finally, your setBarCode() method
public void setBarCode(String code) {
    assert isValidBarCode(code);
    barcode = code;
}
于 2013-04-23T18:13:14.183 回答