2016-04-02 5 views
1

Я относительно новый студент, изучающий Java-программирование, но я хотел бы попросить о помощи. Ошибка, которую я получаю в своем коде, укажет «переменная romanNumeral, возможно, не была инициализирована».переменная, возможно, не была инициализирована

Цель этой программы заключается в том, чтобы пользователь вводил число от 1-39, а затем отображал соответствующее числовое числовое значение для пользователя через диалоговое окно. Код еще не завершен, так как я еще не нашел решение этой проблемы из-за того, что приложение не позволяло мне скомпилировать мой код.

Вот код:

public class exercise4 extends Actor 
{ 
    int userNum; 
    public void act() 
    { 
     intInput(userNum); 
    }  

    public String intInput(int userNum) 
    { 
     String userInput; 
     String romanNumeral; 

     userInput = JOptionPane.showInputDialog("Please enter a number to be converted into Roman Numerals."); 
     userNum = Integer.parseInt(userInput); 

     switch(userNum) 
     { 
      case 1: romanNumeral = "I"; 
        break; 

      case 2: romanNumeral = "II"; 
        break; 

      case 3: romanNumeral = "III"; 
        break; 

      case 4: romanNumeral = "IV"; 
        break; 

      case 5: romanNumeral = "V"; 
        break; 

      case 6: romanNumeral = "VI"; 
        break; 

      case 7: romanNumeral = "VII"; 
        break; 

      case 8: romanNumeral = "VIII"; 
        break; 

      case 9: romanNumeral = "IX"; 
        break; 

      case 10: romanNumeral = "X"; 
        break; 

      case 11: romanNumeral = "XI"; 
        break; 

      case 12: romanNumeral = "XII"; 
        break; 

      case 13: romanNumeral = "XIII"; 
        break; 

      case 14: romanNumeral = "XIV"; 
        break; 

      case 15: romanNumeral = "XV"; 
        break; 

      case 16: romanNumeral = "XVI"; 
        break; 

      case 17: romanNumeral = "XVII"; 
        break; 

      case 18: romanNumeral = "XVIII"; 
        break;   

      case 19: romanNumeral = "XIX"; 
        break;   

      case 20: romanNumeral = "XX"; 
        break; 

      case 21: romanNumeral = "XXI"; 
        break; 

      case 22: romanNumeral = "XXII"; 
        break; 

      case 23: romanNumeral = "XXIII"; 
        break;   

      case 24: romanNumeral = "XXIV"; 
        break; 

      case 25: romanNumeral = "XXV"; 
        break; 

      case 26: romanNumeral = "XXVI"; 
        break; 

      case 27: romanNumeral = "XXVII"; 
        break; 

      case 28: romanNumeral = "XXVIII"; 
        break;  

      case 29: romanNumeral = "XXIX"; 
        break; 

      case 30: romanNumeral = "XXX"; 
        break; 

      case 31: romanNumeral = "XXXI"; 
        break; 

      case 32: romanNumeral = "XXXII"; 
        break; 

      case 33: romanNumeral = "XXXIII"; 
        break; 

      case 34: romanNumeral = "XXXIV"; 
        break; 

      case 35: romanNumeral = "XXXV"; 
        break; 

      case 36: romanNumeral = "XXXVI"; 
        break; 

      case 37: romanNumeral = "XXXVII"; 
        break; 

      case 38: romanNumeral = "XXXVIII"; 
        break; 

      case 39: romanNumeral = "XXXIX"; 
        break; 
     } 

     return romanNumeral; 
    } 
} 
+1

Обратите внимание, что вы можете очень упростить свой код, написав что-то, что вычисляет соответствующую римскую цифру, а не имеет случай для каждого параметра. –

+0

Хм, как? Я очень хотел бы знать, потому что это единственный метод, о котором я могу думать, помимо заявления if-else .. – Blitz

+0

См. Ответы в этом вопросе: http://stackoverflow.com/questions/12967896/converting- целые числа-к-римские цифры-Java- –

ответ

3

Рассмотрите, как будет выглядеть код, если userNum имеет значение 40. Оператор switch не имеет case, который соответствует такому значению, поэтому он ничего не сделает. На что компилятор жалуется: переменная romanNumeral не инициализируется, когда она объявлена, а может не быть даже после switch - таким образом: «переменная romanNumeral, возможно, не была инициализирована».

Две простые исправления: (A) инициализируются при декларации, например. String romanNumeral = "?", или (B) добавить часть по умолчанию в switch, как:

switch(userNum) 
{ 
    // other cases first 

    default: romanNumeral = "?"; 
} 
2

использование default в вашем случае переключения. в java вы должны инициализировать переменную перед ее использованием. в вашем коде, если есть значение, где ни один случай не совпадает, переменная не будет инициализирована.

2

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

1

String romanNumeral делает ссылку на ячейку памяти, но не инициализирует он (не дает ему значения). Поскольку вы можете указать значение usernum, которое не вызывает значения для romanNumeral, вы получаете сообщение об ошибке.
Чтобы избежать этого, вы можете добавить случай по умолчанию.

1

В Java, переменные, определенные в какой-то метод автоматически не инициализируются. Здесь у вас есть два варианта: 1. Инициализировать его с помощью Строка romanNumeral = null (или что-то); 2. Использовать значение по умолчанию в переключателе по умолчанию: romanNumeral = null (или что-то);

1

Ошибка просто означает, что в переменной по-прежнему нет выделенной памяти. так, что вы будете делать, чтобы устранить ошибку, это просто дать ему первоначальный value.this будет делать:

String romanNumeral = "";

1

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

На ваш вопрос был дан ответ, но я хотел бы предложить модификацию.Вслед за этим столом, вы можете сделать HashMap из римских цифр:

Decimal value (v) Roman numeral (n) 
1     I 
4     IV 
5     V 
9     IX 
10     X 
40     XL 
50     L 
90     XC 
100     C 
400     CD 
500     D 
900     CM 
1000    M 

Использование HashMap вы можете рассчитать римскую номер для конкретного integer.Check код просто чтобы дать вам представление о том, чтобы начать работу:

public static void main(String []args){ 
    int c = 39;int temp =0; 
    String roman = ""; 

    if(c<40 && C>10) 
    { 
     temp = c/10; 
     c = c%10; 
     for(int i=0;i<temp;i++) 
     { 
      roman = roman+map.get(10); 

     } 
    } 
    if(c<10 && c>5) 
    { 
     if(c==9) 
     { 
      roman = roman+map.get(9); 
     }else{ 

      temp = c/5; 
      c = c%5; 
      if(temp==1) 
      roamn += map.get(5); 
     for(int i=0;i<c;i++) 
     { 
      roman = roman+map.get(1); 

     } 
     //again you will have to check a case for four the way I did for 9  
     } 

    } 
    } 

    System.out.println(roman); 
} 
Смежные вопросы