2013-04-01 58 views
0

我必須爲控制檯菜單應用程序實現IExecutable接口。我正在實現的方法是:Object execute(Object o);所以我顯示菜單。我從控制檯讀取一個菜單選項,可以是一個整數或一個字符串。在執行我有這個錯誤: java.lang.String不能轉換爲java.lang.Integer 問題是哪個是最好的方式進行轉換。將對象轉換爲整型或字符串的問題

ConsoleMenu.java

public Object execute(Object o) { 
     show(); 
     o = read(); 
     try{ 
      int choice = Integer.parseInt((String) o); // error on this line 
      IExecutable menuOption = getMenuOptions(choice); 
      if(menuOption != null){ 
       o = menuOption.execute(o); 
       return o; 
      } 
       } catch(Exception e){ 
      System.out.println("Invalid option"+ e.getMessage());  
     } 

     return null; 
    } 

private static IExecutable getMenuOptions(int i){ 
    for(MenuOptions option : options){ 
     if(option.getKey() == i && option.getIsActive()){ 
      return option; 

     } 
    } 
    return null; 
} 

public static Object read(){ 
     String option = null; 
     BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); 
     try { 
       option = buffer.readLine(); 
       return option; 

      } 
     catch (IOException e) { 
      System.out.println("IOException " +e.getMessage()); 
     } 
     return null; 
    } 

Main.java

public class Main { 


    public static void main(String[] args) { 
     Integer i = new Integer(1); 
     ConsoleMenu menu = new ConsoleMenu("MATH OPERATIONS"); 
     menu.addMenuOption(new SubOption()); 
     menu.addMenuOption(new AddOption()); 
     i = (Integer) menu.execute(i); 

    } 

} 
+0

是否確定在您指定的線路發生錯誤,並且錯誤是什麼你展示? – dasblinkenlight

+0

錯誤在行i =(整數)menu.execute(i);'。你應該強烈地重新考慮你的設計,這樣你就不會有原始的'Objects'這可能是兩種不同的實際類型之一... –

回答

0

我從控制檯讀取這可能是一個整數或字符串

如果用戶既可以輸入3或菜單選項X作爲菜單選項,那麼你不應該分析你得到的整數值。

如果您有MenuOptions的代碼,請將其關鍵屬性更改爲字符串而不是整數。 如果你不這樣做,不是可能需要速戰速決

private static IExecutable getMenuOptions(String i){ 
    for(MenuOptions option : options){ 
     if(i.equals(option.getKey()+"")) && option.getIsActive()){ 
      return option; 
     } 
    } 
    return null; 
} 

可稱爲

IExecutable menuOption = getMenuOptions((String) o); 
0

在你的錯誤行:

if (o != null && o instanceof Integer){ 
    Integer choice = (Integer)o; 

    //complete here 
} 
0

你假設o是一個真正的字符串,當你調用(String) o

下面是一個對象

String.class.cast(o); 
Integer.class.cast(o); 

我認爲這雖然可能還必須使用instanceOf運營商知道哪些上面做得到一個字符串或Integer對象的更具表現力的方式。 instanceOf不是一個很好的方法(見Is instanceof considered bad practice? If so, under what circumstances is instanceof still preferable?),有些人會做任何事情來避免它。在當前的設計,我認爲你將不得不包括instanceof檢查

+0

class.cast()是如何改進直接轉換的? –

+0

我只是覺得它讀得更好。你實際上用英語說你正在鑄造 – RNJ

+0

嗯,但我不確定這有助於解決這個問題。 –