2017-06-19 34 views
0

我想製作一個程序,讀取TextField中的用戶輸入,並將其保存到保存到文件的ArrayList中。然後,按鈕將允許用戶通過輸入他們正在尋找的動物的名稱來從ArrayList中刪除對象(包含從中導入動物的名稱,ID和國家)。這是按下刪除按鈕時調用的方法的代碼。我得到FileNotFoundException,我不明白爲什麼。你能幫我嗎?從ArrayList中打印對象,無法找到文件

public void DeleteLine(String fileName,String strSearched){ 
      try { 

       ObjectInputStream os = new ObjectInputStream(new FileInputStream(fileName)); 
       ObjectInputStream osTMP = new ObjectInputStream(new FileInputStream("ZooTMP.txt")); 
       animal = (ArrayList<ANIMAL>) os.readObject(); 

       System.out.println("Original contents of animal: "); 
        Iterator itr = animal.iterator(); 

        while(itr.hasNext()) { 
        Object ANIMAL = itr.next(); 
        if (ANIMAL.contains(strSearched)) { 

         itr.remove(); 
          } 


        } 
        System.out.println(); 

        os.close(); 
        osTMP.close(); 

      } catch (FileNotFoundException ex) { 
       System.out.println("Can't find the file Zoo.txt"); 
      } catch (IOException ex) { 
       System.out.println("The file Zoo.txt has already been closed"); 
      } catch (ClassNotFoundException ex) { 
       System.out.printf("Class is missing: %s\n",ex); 
      } 

     } 

這是接口的動物:

package GUI_Try; 

import java.io.*; 

class ANIMAL implements Serializable { 
    String name, ID, country; 

    public ANIMAL(String name, String ID, String country){ 
     this.name = name; 
     this.ID = ID; 
     this.country = country; 
    } 
} 
+0

確保'fileName'指向一個文件,該文件位於您啓動程序的任何位置的工作目錄中。 –

+0

FileNotFoundException中的消息是什麼?文件名是絕對路徑,還是在工作目錄中?它存在嗎?考慮添加一些打印或記錄文件名的調試代碼,並測試文件是否存在 - 'boolean isExtant = new File(fileName).exists()。' –

+0

看起來像我從文件加載數據時,數據是正確閱讀並加載所有內容。但是,我無法在我選擇的目錄中找到該文件。我無法在其他任何地方找到它。 FileNotFoundException是由未使用的'osTMP'造成的。但是,我仍然想知道這個文件在哪裏。 –

回答

0

首先,你證實,該文件是在該項目是同一目錄中創建?任何子目錄都必須包含在文件名中。

其次,(也許不是相關的),但你似乎並沒有在代碼中的任何地方使用osTMP,除了打開和關閉流。也許這是導致FileNotFoundException的文件?有關項目文件中的文件體系結構的一些信息將會有所幫助。您可以一次註釋一行或另一行,並找出哪個文件導致此異常,這也有助於解決問題。

+0

我遵循你的建議。看起來'FileNotFoundException'是由未使用的osTMP引起的。後綴我的代碼在if(ANIMAL.equals(strSearched)){'這一行停止執行,因爲我的文件包含一個'ArrayList',其每個對象都有三個字段:'name','ID'和'country'。很顯然,'strSearched'永遠不會等於所有的三個字段,所以這個if語句永遠不會是真的。你知道我怎麼檢查'ArrayList'對象是否包含一個給定的名字?我嘗試過以各種方式使用'contains',但我總是遇到錯誤。 –

+0

我的錯誤在上面的註釋中,行是'if(ANIMAL.contains(strSearched)){'並且在這裏我得到錯誤消息:'方法contains(String)對於Object類型是未定義的。你知道我該如何檢查'ArrayList'對象的名字是否是'lion',或者甚至更好,我如何檢查給定的字符串是否包含在整個對象中?謝謝。 –

+0

你可以在'Object ANIMAL = itr.next()'後面添加一行,它說'String str = ANIMAL.name;',然後在if條件中比較'str'和'strSearched'。 –