Java: переменная Int всегда возвращается к старому значению при выходе из блока try-catch с помощью сканера. - PullRequest
0 голосов
/ 09 июля 2020

Я здесь совершенно в тупике, и после многих часов возни я просто не могу заставить его работать:

Функция ниже в основном представляет собой меню. Он попросит вас ввести 1, 2 или 3 и вернуть это int.

Если вы введете что-либо, кроме int, он поймает его и снова запустит меню. Если вы введете int, отличный от 1-2-3, он сообщит вам и снова запустит меню.

Проблема в том, что если вы сделаете неверный ввод, он скажет вам правильные вещи, перезапустит меню , но затем, если вы сделаете ПРАВИЛЬНЫЙ ввод, он вернет недопустимое значение, которое вы пробовали раньше, вместо нового, хорошего.

Я следил за ним построчно, и он попадет в возврат из моего if , а затем нажмите return в конце 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;
}

Ответы [ 3 ]

0 голосов
/ 09 июля 2020
• 1000 ввод ИЛИ ввод правильного типа в правильном диапазоне, я добавил логическое значение, чтобы принять к сведению это и использовать его в то время как l oop.

Спасибо за все.

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;
}
0 голосов
/ 09 июля 2020

Попробуйте этот код, надеюсь, это поможет

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

}
0 голосов
/ 09 июля 2020

Каждый раз, когда вы создаете подобное меню, вы должны содержать его в течение некоторого времени l oop. Таким образом, вместо того, чтобы вызывать новый метод (menu()) каждый раз, когда пользователю предлагается сделать выбор, вы просто возвращаетесь к началу блока и повторяете те же действия (System.out.println("1..)).

Если вам требуется сделать это, используя только try / catch, это может произойти в течение некоторого времени l oop.

Оттуда вы можете использовать либо оператор switch, либо группу if-else чтобы проверить каждый возможный выбор и вернуть значение. Если вам необходимо использовать try / catch, вы можете включить в него переключатель или if-else.

...