Java:Int变量在使用scanner退出try-catch块时总是恢复为旧值



我在这里完全被难住了,经过几个小时的摆弄,我似乎无法让它发挥作用:

下面的功能基本上是一个菜单。它会要求你输入1、2或3,然后返回整数

如果你输入了int以外的任何东西,它会捕获它并再次启动菜单。如果你输入了一个不是1-2-3的int,它会告诉你,然后再次启动菜单。

问题是,如果你输入无效,它会告诉你正确的事情,重新启动菜单,但如果你输入正确,它会返回你以前尝试过的无效值,而不是新的好值。

我一行接一行地跟着它,它会从我的if中击中回球,然后在尝试接球结束时击中回球;choixDeMenu";恢复为旧的无效值,并返回该值。如果您被通知它不是int,它会返回0,但如果它是无效的int,它将返回该无效的int。

如果您立即进行VALID输入,该函数将工作并返回您的有效输入。只有当你先尝试无效的东西时,我才会遇到问题。

public static int menu()
{
int choixDeMenu = 0;
System.out.println ("Sélectionner le fichier à importer :");
System.out.println ("1. Partie 1.");
System.out.println ("2. Partie 2.");
System.out.println ("3. Partie 3.");

Scanner waitingForChoice = new Scanner(System.in);
try
{
choixDeMenu = waitingForChoice.nextInt();
if (choixDeMenu < 4 && choixDeMenu > 0)
{
waitingForChoice.close();
return choixDeMenu;
}
else
{
System.out.println("Entrée invalide. Entrer 1, 2, ou 3.");
menu();
}  
} 
catch (InputMismatchException e)
{
System.out.println("Doit être un chiffre. Entrer 1, 2, ou 3.");
menu();
}
catch (Exception e)
{
e.printStackTrace();
}

return choixDeMenu;
}

任何时候创建这样的菜单时,都应该将其包含在while循环中。因此,与其每次提示用户进行选择时都调用一个新方法(menu()(,不如简单地循环回到块的开头并重复相同的操作(System.out.println("1..)(。

如果您需要只使用try/catch来执行此操作,那么这仍然可以在while循环中发生。

从那里,您可以使用switch语句或group-if-else来验证每个可能的选择并返回值。如果需要使用try/catch,则可以将开关或If else包含在其中。

在评论者的帮助下,以下是我如何修改它以使其工作的:

在while循环中转储了所有内容,由于选择的有效性取决于正确的输入类型或正确范围内正确类型的输入,我添加了一个布尔值来注意这一点,并使用它操作while循环。

谢谢你所做的一切。

public static int menu()
{
int choixDeMenu = 0;
boolean validChoice = false;
while (validChoice == false)
{
System.out.println ("Sélectionner le fichier à importer :");
System.out.println ("1. Partie 1.");
System.out.println ("2. Partie 2.");
System.out.println ("3. Partie 3.");
Scanner waitingForChoice = new Scanner(System.in);

try
{      
choixDeMenu = waitingForChoice.nextInt();
if (choixDeMenu < 4 && choixDeMenu > 0)
{
waitingForChoice.close();
validChoice = true;
return choixDeMenu;
}
else
{
validChoice = false;
System.out.println("Entrée invalide. Entrer 1, 2, ou 3.");
}  
} 
catch (InputMismatchException e)
{
validChoice = false;
System.out.println("Doit être un chiffre. Entrer 1, 2, ou 3.");
}
catch (Exception e)
{
e.printStackTrace();
}
} 
return choixDeMenu;
}

试试这个代码,希望这能帮助

public static int menu()
{
int choixDeMenu = 0;
System.out.println ("Sélectionner le fichier à importer :");
System.out.println ("1. Partie 1.");
System.out.println ("2. Partie 2.");
System.out.println ("3. Partie 3.");
Scanner sc = new Scanner(System.in);
int prev=0;
int flg=0;
while(true){
try{
choixDeMenu = sc.nextInt();
if(choixDeMenu>0 && choixDeMenu<4){
if(flg==0){
return choixDeMenu;
}
else{
return prev;
}
}
else{
System.out.println("Entrée invalide. Entrer 1, 2, ou 3.");
prev = choixDeMenu;
flg=1;
continue;
}
}
catch(InputMismatchException e)
{
System.out.println("Doit être un chiffre. Entrer 1, 2, ou 3.");
sc.next();
continue;
}
}
}

最新更新