2014-11-11 2 views
0

Я преобразую римский цифровой ввод в его целочисленное значение. В моем методе convertChar я все время получаю сообщение об ошибке, что это недостижимый оператор всякий раз, когда я добавляю оператор break в код. Я не знаю, почему это так. Я новый студент, и я, должно быть, сделал что-то не так, и я надеялся, что кто-то может показать мне, что я сделал не так, и как исправить это. Это должно быть связано с тем, как я правильно подбираю методы? Я все еще путаюсь с тем, какие переменные вводятся, поэтому, возможно, я испортил их, но я недостаточно опытен, чтобы точно знать, что я сделал неправильно. Вот все, что у меня есть:Зачем мне эта ошибка «недостижимого утверждения»?

public class RomanNumeralConverter { 

public int romanInput() {  
    return convert(getUserInput()); 
} 

public String getUserInput() { 

    Scanner numberInput = new Scanner (System.in); 
    System.out.print("Enter a roman numeral in uppercase: "); 
    String userInput = numberInput.next(); 
    numberInput.close(); 
    return userInput; 
} 

public int convert (String userInput) { 
    int result = 0; 
    int subtractamount = 0; 
    int x = userInput.length(); 
    while(x != 0) { 
    char romanConvert = userInput.charAt(x); 
     if(x >= 1) { 
     if(convertChar(romanConvert) >= convertChar(userInput.charAt(x - 1))) { 
     subtractamount += convertChar(userInput.charAt(x - 1)); 
    } 
} 
    result += convertChar(romanConvert); 
    x--; 

} 
result -= subtractamount; 
return result; 

} 

public static char convertChar(char value) { 
    switch (value) { 
     case 'I': 
      return 1; 
      break; 
     case 'V': 
      return 5; 
      break; 
     case 'X': 
      return 10; 
      break; 
     case 'L': 
      return 50; 
      break; 
     case 'C': 
      return 100; 
      break; 
     case 'D': 
      return 500; 
      break; 
     case 'M': 
      return 1000; 
      break; 
     default: 
      System.out.println("Invalid character!"); 
      return 0; 
      break; 
} 
    return value; 

} 

public void printValue() { 
    System.out.println(romanInput()); 
} 

public static void main(String[] args) { 
    new RomanNumeralConverter().printValue(); 
} 
} 
+5

Оператор switch будет _allways_ возвращать значение, что означает, что 'return value' никогда не будет достигнуто. – August

ответ

2

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

public static char convertChar(char value) { 
    char result; 
    switch (value) { 
     case 'I': 
      result = 1; 
      break; 
     case 'V': 
      result = 5; 
      break; 
     case 'X': 
      result = = 10; 
      break; 
     case 'L': 
      result = 50; 
      break; 
     case 'C': 
      result = 100; 
      break; 
     case 'D': 
      result = 500; 
      break; 
     case 'M': 
      result = 1000; 
      break; 
     default: 
      System.out.println("Invalid character!"); 
      result = 0; 
      break; 
        } 
     return result 
} 
2

В Java, это ошибка компиляции, чтобы иметь заявления, которые никогда не будут достигнуты во время исполнения. В вашем случае оператор break никогда не будет достигнут, так как над ним есть надпись return. Также этот последний оператор возврата никогда не будет достигнут, поскольку вы уже вернулись бы в любом случае к концу блока switch.

1

Проблема в вашем заявлении switch.

A default кейс можно назвать else в заявлении if-else; он будет всегда выполнить, если никакое другое условие в switch не выполнено. Если вы выполняете return (или) внутри корпуса default, любой код, который следует после этого, не будет доступен.

У вас есть два варианта:

  • изменить return заявления для только присвоить значение result вместо этого, это означает, что есть только одна точка возврата из кода, или
  • Снимите return result с после того, как ваш switch.
Смежные вопросы