Использование переменных, инициализированных в операторе switch, снаружи - PullRequest
2 голосов
/ 29 ноября 2011

У меня проблема с доступом к переменным, инициализированным в операторе switch, а затем с использованием их вне switch.

Вот что должен выдать мой код: Что такое: X (+ - * или /) X

Вот мой код Java:

import java.util.Random;
import java.util.Scanner;

public class Test2 {
        public static void main(String[]args){

        Random rand = new Random();
        Scanner sc = new Scanner(System.in);

        int svar, ans;
        int tal1 = rand.nextInt(100) + 1;
        int tal2 = rand.nextInt(100) + 1;

        String characters = "+-*/";
        int r = rand.nextInt(characters.length());
        char randomChar = characters.charAt(r);

        switch(randomChar){
        case '+':
            ans = tal1 + tal2;
            break;
        case '-':
            ans = tal1 - tal2;
            break;
        case '*':
            ans = tal1 * tal2;
            break;
        case '/':
            ans = tal1 / tal2;
            break;
        }

        System.out.println("What is: "+tal1+randomChar+tal2+"?");
        svar = sc.nextInt();

        if (svar == ans)
            System.out.println("Correct!");
        else
            System.out.println("Wrong - Right answer: "+ans);

        }
}

Как видите, "ans" был объявлен и инициализирован. Тем не менее, я хочу использовать переменную ans в операторе if (для сравнения результата) и в выводе.

Теперь я мог бы расширить каждый случай и написать как операторы if, так и выходные данные, но код был бы слишком излишним, поскольку я пытаюсь сделать подобный код, но меньшего размера. Любые советы, как эта работа будет работать?

Вот ошибка компиляции, которую я получаю:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    The local variable ans may not have been initialized
    The local variable ans may not have been initialized

    at Test2.main(Test2.java:36)

Ответы [ 7 ]

2 голосов
/ 29 ноября 2011

Добавить регистр default, чтобы перехватить любой неопознанный ввод. В вашем случае это может привести к RuntimeException, поскольку с вашим кодом что-то не так, если этот случай достигнут.

default: 
  throw new RuntimeException("Unexpected operation: " + randomChar);

Полученная ошибка означает, что существует путь к коду, который не может быть инициализирован ans. не выбирайте легкий путь и инициализируйте ans бессмысленным значением, когда оно объявлено! Это просто скроет это ценное предупреждение о реальной проблеме с вашим кодом.

1 голос
/ 30 ноября 2011

В отличие от переменных экземпляра, локальные переменные не инициализируются автоматически.

Вам необходимо явно инициализировать его значением по умолчанию.

 int svar, ans = 0; // assuming 0 is default value for ans

Если в вашем switch произойдет сбой всех дел, то ans никогда не будет инициализирован.

0 голосов
/ 30 ноября 2011

Вы не инициализировали ans до переключения.

Я не рекомендую ответ erikson, поскольку ваш randomChar будет выдавать только обработанные входные данные (вы никогда не достигнете значения по умолчанию).

0 голосов
/ 30 ноября 2011

Просто измените объявление int svar, ans; на int svar, ans=0;, чтобы удалить эту ошибку.Проблема в том, что ваша переменная ans не инициализируется в этой строке: if (svar == ans), а в вашем регистре переключения нет default case.

0 голосов
/ 29 ноября 2011

Вы получаете эту ошибку компиляции, потому что компилятор не знает, будет ли когда-либо инициализирован ans, по причине того, что во время компиляции неизвестно, будет ли когда-либо выполнено условие переключения, следовательно, ошибка компиляции.Чтобы разрешить его, инициализируйте ans для некоторого значения, такого как:

ans = -1;

Также взгляните на это сообщение и это

0 голосов
/ 29 ноября 2011

Если вы объявляете локальную переменную (внутри функции), вы всегда должны инициализировать ее

int svar = 0;
int ans = 0;

если вы объявите это вне функции, то она будет автоматически инициализирована с 0, но это не очень хорошая практика для этого

0 голосов
/ 29 ноября 2011

Локальные переменные, такие как ans, должны быть инициализированы перед использованием.

Так что просто присвойте ноль ans

...