2013-08-20 51 views
1

將靜態方法添加到對象的Arraylist對象。在Try-Catch中無法完全執行的靜態方法

public static void addObject() { 
    int id; 
    String name; 

    try{ 
     System.out.print("Id: "); 
     id = Integer.parseInt(sc.next()); 

     System.out.print("Name: "); //when the program gets here, he just skips back to my main class... 
     name = sc.nextLine(); 

     Object o = new Object(id, name); 
     l.addObject(o); //adds the object to this list (l) of objects 
    } 
    catch(NumberFormatException nfe){ 
     System.out.println("Not a valid id!"); 
     addObject(); 
    } 
} 

我的主要方法是在do-while-loop中包含一個開關,它添加,刪除和編輯對象。

public static void main(String[] args){ 
    int choice; 
    do{ 
     try{ 
      choice = Integer.parseInt(sc.next()); 
      switch (choice){ 
       case 0: break; //ends the program 
       case 1: addObject(); break; //starting static method to add an object with a name and an id 

       //here are some more cases with similar static methods (left them out for simplicity) 

       default: System.out.println("Not a valid choice!");break; 
      } 
     } 
     catch(NumberFormatException nfe){ 
      System.out.println("Not a valid choice!"); 
      choice = -1; //to keep the loop running, and prevent another exception 
     } 

    }while (choice != 0); 

System.out.println("Good bye!"); 

} 

我Object類

public class Object{ 

    private int id; 
    private String name; 

    public Object(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 
} 

我的鏈表類類

import java.util.*; 

public class ObjectList { 

    private List<Object> objects; 

    public ObjectList() { 
     objects = new ArrayList<Object>(); 
    } 

    public void addObject(Object o){ 
     objects.add(d); 
    } 
} 

當我嘗試運行靜態方法來添加一個對象,它記錄對象的ID就好了,但是當我輸入對象id時,它會回到我的主要方法,從頭開始循環。 當我在交換機中輸入一個字符串(重新啓動循環)時,它反應得很好。 但我似乎無法正確添加對象。

這也是一個學校任務,他們給了我們所有的代碼(try-catch方法除外),並要求我們爲靜態方法和主要方法編寫一個try-catch。 我大概可以找到一個解決方法的主要方法與if-clause,但我想知道如果這是可能的try-catch方法。

+0

ID和名稱在同一行上嗎? –

+2

'new Object(id,name);'??? Object如何獲得這個構造函數?這是否編譯? –

+2

@HovercraftFullOfEels我的猜測是他很可能創建了自己的Object類。 –

回答

1

問題:

  • 當使用掃描儀,你必須瞭解它是如何做和不處理行標記的結束,特別是當你把該處理此令牌(nextLine()例如方法調用)和那些沒有的(例如nextInt())。請注意,前者nextLine()會吞噬行尾(EOL)令牌,而nextInt()和類似方法則不會。所以,如果你打電話給nextInt(),並且結束線標記糾纏,調用nextLine()將不會得到你的下一行,而是寧願吞下懸掛的EOL標記。一種解決方案是在調用sc.nextInt()後調用sc.nextLine()來處理EOL令牌。否則,如果您撥打sc.next(),請將其更改爲sc.nextLine()
  • 不要使用遞歸(讓addObject()方法調用自己),因爲你正在做一個簡單的while循環會更好,更乾淨,更安全的地方。
  • 如果您確實有一個名爲「Object」的類,請將其更改爲與所有Java類的關鍵基類衝突。

舉例來說,如果你有這樣的代碼:

Scanner sc = new Scanner(System.in); 
System.out.print("Enter a number: "); 
int number = sc.nextInt(); 
System.out.print("Enter name: "); 
String name = sc.nextLine(); 

你會發現,這個名字總是"",那是因爲sc.nextLine()正在吞噬線的末端(EOL)令牌左從用戶輸入的號碼結束。解決此問題的一種方法是:

Scanner sc = new Scanner(System.in); 
System.out.print("Enter a number: "); 
int number = sc.nextInt(); 
sc.nextLine(); // ***** to swallow the dangling EOL token 
System.out.print("Enter name: "); 
String name = sc.nextLine(); 
+0

謝謝您的深入解答!我會嘗試使用你的提示,看看它是否有效。不,從我的母語開始,它不是真的叫做Object,因此我的程序並不是真正的英文,所以爲了讓你們更容易我爲你們翻譯它。 –