我的头衔并不是最好的,但我不确定如何命名我要做的事情。无论哪种方式,我都有一个案例切换......
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个字符长。如果不是,我想忽略该条目并从菜单重新开始。我遇到的问题是,即使条形码无效且未设置,程序也会继续询问项目名称。
如何跳过所有这些并再次打印菜单?
答案 0 :(得分:2)
两种策略可以解决这个问题:
setBarCode
方法之外移动检查条形码有效性并首先进行测试(或修改setBarCode
以返回指示条形码是否有效的boolean
。addItem
以返回比boolean
更丰富的信息,以便您可以区分三种情况:条形码不良;成功;失败,因为它需要更多信息。答案 1 :(得分:1)
setter setBarCode()
应该(a)成功,或者(b)指示失败(可能使用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;
但是,我建议您不要依赖设定者的失败来确保正确性。在风格上,它闻起来很有趣。"相反,我将测试放在另一个(可能static
)方法中,在之前测试,然后调用setter并做出相应的反应,然后将assert
放入二传手。所以,更像这样:
// 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;
}