我是java的新手并且有以下问题。我已经找到了几个答案,但仍然不清楚如何实现 while block 来解决问题:
在下面的代码中,我尝试从用户输入中接收有关“产品名称”和“价格”的信息。 product name是使用scanner.next()函数检索的字符串,价格是double。如果用户提供的产品名称与使用空格不一致,则我会在catch块中捕获一个错误。 问题是我如何回到try块并给用户第二次机会输入产品名称值而不是退出系统?我对这个问题进行了很多搜索,但仍未找到解决方案。
String[] sArrProdName = new String[newUser.getNumberOfItemsInStock()] ;
double[] sArrPrice = new double[newUser.getNumberOfItemsInStock()];
for(int i=0;i<newUser.getNumberOfItemsInStock();i++)
{
try {
System.out.println("Enter product Name: ");
sArrProdName[i]= s.next();
System.out.println("Price? : ");
sArrPrice[i] = s.nextDouble();
}
catch (InputMismatchException e) {
prompt("Enter product name correctly");
}
}
答案 0 :(得分:0)
我刚刚写了这个,但设置看起来像这样:
String[] sArrProdName = new String[newUser.getNumberOfItemsInStock()] ;
double[] sArrPrice = new double[newUser.getNumberOfItemsInStock()];
for(int i=0;i<newUser.getNumberOfItemsInStock();i++)
{
boolean retryInput = true;
while (retryInput)
{
try {
System.out.println("Enter product Name: ");
sArrProdName[i]= s.next();
System.out.println("Price? : ");
sArrPrice[i] = s.nextDouble();
retryInput = false;
}
catch (InputMismatchException e) {
prompt("Enter product name correctly");
}
}
}
这里的基本前提是try块可以被认为是它自己的自包含if
语句 - if
正在尝试的任务完成,执行块的其余部分。因此,可以将简单的布尔标志设置为仅在验证代码后更改。
当然,retryInput = false;
本身之前还有你想做的检查;那里只有 ,作为更改布尔标志位置的演示。
编辑:向Dici致敬,他们的评论是正确的。
答案 1 :(得分:0)
这样的事情可行:
class ProductInfo{
public static final int NUM_RETRY = 3;
public static void main(String[] args) {
String[] sArrProdName = new String[newUser.getNumberOfItemsInStock()] ;
double[] sArrPrice = new double[newUser.getNumberOfItemsInStock()];
int cont;
for(int i=0;i<newUser.getNumberOfItemsInStock();i++){
cont = 0;
while (cont<=NUM_RETRY){
try {
System.out.println("Enter product Name: ");
sArrProdName[i]= s.next();
System.out.println("Price? : ");
sArrPrice[i] = s.nextDouble();
}catch (InputMismatchException e) {
cont++;
prompt("Enter product name correctly");
}
}
}
}
}
答案 2 :(得分:0)
您可以使用https://github.com/bnsd55/RetryCatch
示例:
RetryCatch retryCatchSyncRunnable = new RetryCatch();
retryCatchSyncRunnable
// For infinite retry times, just remove this row
.retryCount(3)
// For retrying on all exceptions, just remove this row
.retryOn(ArithmeticException.class, IndexOutOfBoundsException.class)
.onSuccess(() -> System.out.println("Success, There is no result because this is a runnable."))
.onRetry((retryCount, e) -> System.out.println("Retry count: " + retryCount + ", Exception message: " + e.getMessage()))
.onFailure(e -> System.out.println("Failure: Exception message: " + e.getMessage()))
.run(new ExampleRunnable());
在ExampleRunnable中,您可以编写自己的匿名函数
答案 3 :(得分:0)
A: while(true) {
try {
Scanner input = new Scanner(System.in);
System.out.println("How old are you?");
age = input.nextInt();
input.close();
break;
} catch (Exception e) {
System.out.println("You need to enter an integer!");
break;
}
finally{
if (age == 0)
continue A;
}
}
答案 4 :(得分:0)
我已经编写了一个名为unreliable的库,可以在这里为您提供帮助:
String[] sArrProdName = new String[newUser.getNumberOfItemsInStock()] ;
double[] sArrPrice = new double[newUser.getNumberOfItemsInStock()];
for(int i=0;i<newUser.getNumberOfItemsInStock();i++)
{
System.out.println("Enter product Name: ");
sArrProdName[i]= s.next();
Unreliable.keepTrying(() -> {
System.out.println("Price? : ");
sArrPrice[i] = s.nextDouble();
});
}
库中还有其他类似的方法,可让您指定重试次数,要忽略的异常等。