Ошибка при получении буквы «s» с помощью сканера

Ошибка при получении буквы s - Scanner:

do{
    //¿Volver a jugar?
    Scanner teclado = new Scanner(System.in);
    System.out.println("¿Volver a jugar?(s/n): ");
    volverjugar = teclado.nextLine();
    System.out.println(volverjugar);
} while ( volverjugar != "s" );
2
задан 28.11.2019, 04:51
3 ответа

Cannot find symbol volverjugar - он не допускает, что переменная

себе должна Ошибка porquГ© в ningГєn момент, ты объявил идентификатора volverjugador, а именно, составитель никогда это reconocerГЎ и поэтому razГіn у тебя не выходит эта ошибка compilaciГіn.

возможная Одна soluciГіn, он состоит в том, чтобы объявлять переменную volverjugar (deberГ - чтобы быть типа string) как помещение в начале mГ©todo main.

Таким образом, составитель не deberГ, - чтобы посылать ningГєn ошибку синтаксиса; однако, ты cГіdigo у него есть несколько недостатков:

1. В этой части cГіdigo ocurrirГЎ возможный бесконечный цикл:

do{
   Scanner teclado = new Scanner(System.in);
   System.out.print("Introduce numero: ");
   numero = teclado.nextInt();
   System.out.println(numero);
   cont++;
} while (numero != rand );

, Если ты замечаешь, cГіdigo наверху он seguirГЎ прося informaciГіn пользователя до тех пор, пока он не введет информацию в компьютер nГєmero правильно. Проблема укореняется в том, что мы не знаем в том, что момент coincidirГЎ nГєmero введенный в компьютер пользователем, со стоимостью, у которой есть rand. PodrГ, - чтобы быть в 10 попытках, в 1000 попытках. Чтобы предотвращать этот недостаток, podrГ-хозяева распределять ему один lГ-mite ввода информации nГєmeros (например, 5 попыток), таким образом, мы делаем игру mГЎs интерактивный с пользователем.

В cГіdigo quedarГ - в asГ-:

do{
  System.out.print("Introduce numero: ");
  numero = teclado.nextInt();
  cont++;
  //Cuando el usuario haga 5 intentos, el bucle finaliza.
  if(cont == 6) break;
}while (numero != rand );

2. В этой части cГіdigo estГЎs сравнивая ссылки:

}while (volverjugar != "si" );

cГіdigo наверху того, что harГЎ состоит в том, чтобы сравнивать ссылки на объекты, а именно, ocurrirГЎ бесконечный цикл, благодаря тому, что, ссылки (адреса памяти) не serГЎn ты был равен.

возможная Одна soluciГіn, - используя mГ©todo equalsIgnoreCase из класса String.

Тогда, с этим mГ©todo мы сможем сравнивать цепи безопасной формы, если пользователь введет SI или si в компьютер, mГ©todo retornarГЎ true и harГЎ, который игра начала снова. Если пользователь вводит в компьютер, что NO или no, devolverГЎ false и это harГЎ, который цикл закончил (porquГ© условная не cumplirГЎ и поэтому, цикл ломает).

}while(volverjugar.equalsIgnoreCase("si") == true);

3. Не необходимо создавать в каждый iteraciГіn объекты типа Scanner.

Эстар создавая объекты типа Scanner, Гєnico, которой ты добивался, состоит в том, чтобы давать mГЎs процессы пересборщик мусора из Java, благодаря тому, что, в каждый repeticiГіn, deberГЎ размещать память dinГЎmicamente для объекта и шага, искать точный момент, чтобы освобождать память.

Способ это оптимизировать, - сохраняя ссылку объекта типа Scanner в начале mГ©todo main.

cГіdigo завершил, с осуществленными изменениями, quedarГ - в, таким образом:

import java.util.*;

public class Program
{
    public static void main(String[] args) 
    {
        Scanner teclado = new Scanner(System.in);
        Random random = new Random();
        int rand = random.nextInt();
        int numero;
        int cont = 0;
        String volverjugar;
        do{
            do{
                System.out.print("Introduce numero: ");
                numero = teclado.nextInt();
                cont++;
                if(cont == 6) break;
            }while (numero != rand );
            System.out.println("Intentos partida:" + cont);
        //Esto limpia el bufer del teclado
        teclado.nextLine();
        //¿Volver a jugar?
        System.out.println("Volver a jugar?(si/no): ");
        volverjugar = teclado.nextLine();
        cont = 0;
        }while(volverjugar.equalsIgnoreCase("si") == true);
    }
}

Эта lГ-nea cГіdigo:

teclado.nextLine();
//¿Volver a jugar?

Ло Гєnico, который делает, состоит в том, чтобы отлаживать bГєfer клавиатуры. Это необходимо porquГ©, как llamГі в mГ©todo nextInt (класса Scanner), dejarГЎ bГєfer грязный (с разрывом lГ-nea) и это должно отлаживать это, иначе, когда ты захочешь попросить пользователя, который, если он хочет вернуться, сыграв или нет, не pausarГЎ программа и как volverjugar valdrГЎ \n, harГЎ, что условная: volverjugar.equalsIgnoreCase("si") == true dГ© как результат false, способствуя тому, чтобы игра закончилась без того, чтобы пользователь взял ее decisiГіn того, чтобы выходить.

1
ответ дан 01.12.2019, 10:45

Чтобы подбирать String с Scanner ты должен использовать método nextLine () .

AdemÃ: s, когда ты спрашиваешь о консоли System.out.print ln ("Â: Вновь играть? (s/n):") обрати внимание, что он с ln , для того, чтобы разрыва линии и взял ввод teclado.nextLine () . As¦-:

public static void jugarPartida(){
    Scanner teclado = new Scanner(System.in);
    System.out.println("¿Volver a jugar? (s/n):");//es print con ln
    volverjugar = teclado.nextLine();
    System.out.println(volverjugar);
}

Я Должен señalar, что método из-за mÃ: s, что ты функционировал, не делается as¦-. Сначала, который Scanner не инициализирует внутри método, так как каждый раз, когда он назвался éste crearÃ: новый объект Scanner. Después, который нужно использовать внутри цикла для того, чтобы повторился acci¦n играть пока volverjugar стоил s

0
ответ дан 01.12.2019, 10:45
  • 1
    Спасибо. Он говорит мне из-за volverjugar, что " Cannot find symbol". Поскольку который не está объявленная переменная. – alderson 28.11.2019, 00:57

Предполагая, что переменная - типа Char, ésto ты funcionar¦ - в:

volverjugar = teclado.next().charAt(0);

Может, что ésto тебе помог

¿ Возможно читать характер из-за клавиатуры в Java?

0
ответ дан 01.12.2019, 10:45