【问题标题】:Java : Int variable always reverts to old value when exiting try-catch block with scannerJava:使用扫描仪退出 try-catch 块时,Int 变量始终恢复为旧值
【发布时间】:2020-07-09 17:25:54
【问题描述】:

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

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

如果您输入除 int 以外的任何内容,它会捕获并再次启动菜单。 如果您输入 1-2-3 以外的 int,它会告诉您,然后再次启动菜单。

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

我逐行跟踪它,它会从我的 if 中返回,然后在 try-catch 结束时返回返回,“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;
}

【问题讨论】:

  • 您正在递归调用menu(不幸的是),但您忽略了递归调用的返回值。最好使用while 循环并且没有递归。

标签: java recursion try-catch java.util.scanner return-value


【解决方案1】:

任何时候你创建一个这样的菜单,你应该把它包含在一个while循环中。因此,您无需在每次提示用户做出选择时都调用新方法 (menu()),而是简单地回到块的开头并重复相同的操作 (System.out.println("1..))。

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

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

【讨论】:

  • 漂亮,我在一个while循环中倾倒了所有东西,它可以工作。我添加了我的解决方案作为答案。非常感谢。
【解决方案2】:

在评论者的帮助下,这是我修改它的方法:

在 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;
}

【讨论】:

    【解决方案3】:

    试试这个代码希望对你有帮助

        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;
          }
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      相关资源
      最近更新 更多