簡體   English   中英

Java:使用掃描儀退出 try-catch 塊時,Int 變量始終恢復為舊值

[英]Java : Int variable always reverts to old value when exiting try-catch block with scanner

我在這里完全被難住了,經過幾個小時的擺弄,我似乎無法讓它工作:

下面的function基本上就是一個菜單。 它將要求您輸入 1、2 或 3 並返回該 int。

如果您輸入除 int 以外的任何內容,它會捕獲並再次啟動菜單。 如果您輸入 1-2-3 以外的 int,它會告訴您,然后再次啟動菜單。

問題是,如果您輸入無效,它會告訴您正確的事情,重新啟動菜單,但是如果您輸入正確的輸入,它將返回您之前嘗試過的無效值,而不是新的、好的值。

我逐行跟蹤它,它會從我的 if 中返回,然后在 try-catch 的末尾返回返回,“choixDeMenu”恢復為舊的無效值並返回該值。 如果你被告知它不是一個 int,它返回 0,但如果它是一個無效的 int,它會返回那個無效的 int。

如果您立即進行 VALID 輸入,function 將工作並返回您的有效輸入。 只有當您首先嘗試無效的事情時,我才會遇到問題。

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 語句或組 if-else 來驗證每個可能的選擇並返回值。 如果您需要使用 try/catch,您可以在其中包含 switch 或 if-else。

在評論者的幫助下,這是我對其進行修改的方式:

在while循環中轉儲所有內容,並且由於選擇的有效性取決於正確的輸入類型或正確范圍內的正確類型的輸入,我添加了一個 boolean 來記錄這一點並使用它來操作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;
      }
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM