2017-06-19 31 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'。 –