Java-дубликат локальной переменной.Тупик - PullRequest
0 голосов
/ 11 марта 2019

Я новичок в кодировании и пытаюсь заставить работать мою вторую программу.Это довольно просто относительно того, что он делает, но он выдает ошибку в строке 24 «Подтверждение дубликата локальной переменной».Не могу понять, почему мне не нравится то, что я делаю.

Scanner userInput = new Scanner(System.in);  
char confirm;

do{

System.out.println("Welcome to the story teller");
System.out.println("What is your name?");
String name = userInput.nextLine();

System.out.println("How old are you?");
int age = userInput.nextInt();

System.out.println("What country would you like to visit?");
String country = userInput.nextLine();

System.out.println("Great! So your name is" + name + ", you are" + age + "years old and you would like to visit" + country + "?");
System.out.println("Press Y to continue or N to start over");
char confirm = userInput.next().charAt(0);

  if (confirm !='y' || confirm !='n'){
 System.out.println("Sorry that input is not valid, please try again"); 
}
  else {
  System.out.println(name + "landed in" + country + "at the age of" + age + ".");
  }
} while(confirm == 'Y'|| confirm == 'y');

Ответы [ 4 ]

1 голос
/ 11 марта 2019

Поскольку ваша переменная «подтверждения» уже определена в области видимости (вторая строка).Если вы хотите присвоить значение, просто напишите confirm = userInput.next().charAt(0);

1 голос
/ 11 марта 2019

Вы объявляете confirm дважды. Измените второе объявление на просто присвоение ему, и вы должны быть в порядке:

confirm = userInput.next().charAt(0);
// No datatype, so you aren't declaring confirm, just assigning to it
0 голосов
/ 11 марта 2019

Кажется, кроме повторного объявления переменной confirm есть одна или несколько проблем -

Проблема 1:

После int age = userInput.nextInt().Он не будет запрашивать ввод страны и запросит Press Y to continue or N to start over.

Причина этой проблемы:

Поскольку вы используете int age = userInput.nextInt();, сканер примет толькоцелочисленное значение из ввода и пропустит символ новой строки \n.

Исправление

В качестве обходного пути я добавил userInput.nextLine(); после int age = userInput.nextInt();, так что он будет использовать символ \n после nextInt().

Проблема 2:

После 1-й итерации эта строка вызовет ошибку confirm = userInput.next().charAt(0);.

Причина этой проблемы:

В 2-й итерации вы не получите приглашение ввести имя в виде строки String name = userInput.nextLine(); примет \n из последней итерации в качестве входных данных и пропустит и запросит возраст How old are you?.

Fix

В качестве обходного пути я добавилuserInput.nextLine(); после confirm = userInput.next().charAt(0);, так что после userInput.next().charAt(0) он будет использовать символ \n, и следующая итерация пойдет как положено.

Проблема 3:

Эта логика if (confirm !='y' || confirm !='n') ожидает только y и n в lowercase, но здесь while(confirm == 'Y'|| confirm == 'y') вы ожидаете y и Y оба.

Исправление - я добавил необходимые изменения в приведенный ниже код, но рекомендовал бы изменить его на случай переключения.

ПРИМЕЧАНИЕ:

Не рекомендуется делать userInput.nextLine() после каждого ввода, и вы можете просто разобрать его.См. здесь для получения дополнительной информации.

Я не рекомендую это, но это заставит вас работать с программой

Scanner userInput = new Scanner(System.in);
    char confirm;

    do {

        System.out.println("Welcome to the story teller");
        System.out.println("What is your name?");
        String name = userInput.nextLine();

        System.out.println("How old are you?");
        int age = userInput.nextInt();

        userInput.nextLine(); //adding this to retrieve the \n from nextint()

        System.out.println("What country would you like to visit?");
        String country = userInput.nextLine();

        System.out.println("Great! So your name is " + name + ", you are " + age
                + "years old and you would like to visit " + country + " ?");
        System.out.println("Press Y to continue or N to start over");
        confirm = userInput.next().charAt(0);

        userInput.nextLine(); //adding this to retrieve the \n this will help in next iteration

        System.out.println(name + " landed in " + country + " at the age of " + age + ".");

        if (confirm == 'y' || confirm == 'Y') {
            continue; // keep executing, won't break the loop
        } else if (confirm == 'n' || confirm == 'N') {
            break; // breaks the loop and program exits.
        } else {
            System.out.println("Sorry that input is not valid, please try again");
            // the program will exit
        }
    } while (confirm == 'Y' || confirm == 'y');
}

Рекомендую использовать регистр переключателей вместо сравнения if 1094, анализировать ввод символов и целых чисел и удалять произвольный userInput.nextLine(), добавленный в качестве обходного пути.

0 голосов
/ 11 марта 2019

Еще один вариант исправления - удалить ненужное объявление char confirm;

И используйте его только при необходимости

char confirm = userInput.next().charAt(0);

Как предложил @ScaryWombat, вам необходимо изменить область действия переменной (в настоящее время while находится в области, отличной от do)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...