Java 文本文件转换为arraylist时出现问题

Java 文本文件转换为arraylist时出现问题,java,file-io,arraylist,bufferedreader,java-io,Java,File Io,Arraylist,Bufferedreader,Java Io,如果解决方案比较明显,我会提前道歉;然而,我高中的AP compsci课程几乎没有涉及IO或文件组件。我一直在尝试编写一个基本的flashcard程序——因此,从文本文件中读取字符串比向数组中添加100个对象要实际得多。我的问题是,当我最后检查ArrayList的大小和内容时,它是空的。我的源代码如下: public class IOReader { static ArrayList<FlashCard> cards = new ArrayList<FlashCard>

如果解决方案比较明显,我会提前道歉;然而,我高中的AP compsci课程几乎没有涉及IO或文件组件。我一直在尝试编写一个基本的flashcard程序——因此,从文本文件中读取字符串比向数组中添加100个对象要实际得多。我的问题是,当我最后检查ArrayList的大小和内容时,它是空的。我的源代码如下:

public class IOReader
{
  static ArrayList<FlashCard> cards = new ArrayList<FlashCard>();
  static File file = new File("temp.txt");

  public static void fillArray() throws FileNotFoundException, IOException
  {
    FileInputStream fiStream = new FileInputStream(file);
    if(file.exists())
    {
      try( BufferedReader br = new BufferedReader( new InputStreamReader(fiStream) )
      {
        String line;
        String[] seperated;
        while( (line = br.readLine()) != null)
        {
          try
          {
            seperated = line.split(":");
            String foreign = seperated[0];
            String english = seperated[1];
            cards.add( new FlashCard(foreign, english) );
            System.out.println(foreign + " : " + english);
          }
          catch(NumberFormatException | NullPointerException | ArrayIndexOutOfBoundsException e)
          {
            e.printStackTrace();
          }
          finally{ 
            br.close(); 
          }
        }
      }
    }
    else{
      System.err.print("File not found");
      throw new FileNotFoundException();
    }
  }
  public static void main(String[] args)
  {
    try{
      fillArray();
    }
    catch (Exception e){}
    for(FlashCard card: cards)
      System.out.println( card.toString() );
    System.out.print( cards.size() );
  }
}

我的FlashCard类非常简单;它只接受两个字符串作为参数。但问题是,无论何时运行此命令,都会输出除主方法中打印的0之外的所有内容,这表示ArrayList为空。我提前感谢您的帮助,任何人都将不胜感激。

需要考虑的几点:

  • 在您的
    fillArray()
    中,可以抛出异常并在代理中捕获它们 程序的
    main()
    部分,因此
    fillArray()
    中的代码将更加丰富 可读,并且不会隐藏异常
  • 我认为没有必要检查文件是否存在,因为如果它不存在 存在时,将抛出异常,并且
    main()
    函数将使用它
  • 我使用Igal类而不是FlashCard类,它与您的FlashCard类相同
  • Igal等级代码:

    public class Igal {
        private String st1;
        private String st2;
    
    public Igal(String s1, String s2){
        st1 = s1;
        st2 = s2;
    }
    
    
    
    /**
     * @return the st1
     */
    public String getSt1() {
        return st1;
    }
    
    /**
     * @param st1 the st1 to set
     */
    public void setSt1(String st1) {
        this.st1 = st1;
    }
    
    /**
     * @return the st2
     */
    public String getSt2() {
        return st2;
    }
    
    /**
     * @param st2 the st2 to set
     */
    public void setSt2(String st2) {
        this.st2 = st2;
    }
    
    @Override
    public String toString(){
        return getSt1() + " " + getSt2();
    }
    
    }

    代码:

    输出:

    ------------------
    Volare   To Fly
    Velle   To Wish
    Facere   To Do / Make
    Trahere   To Spin / Drag
    Odisse   To Hate
    the size is 5
    

    您可能过早关闭bufferedreader。在try-catch构造完成后,您将关闭它作为一个finally。然而,这意味着在while循环的第二次迭代中,bufferedreader已经关闭。完成while循环后关闭它。不过,这并不能完全解决问题,因为它不能解释为什么循环中根本不打印任何内容。第一个提示:与其忽略
    main()
    中的异常
    e
    ,不如尝试打印堆栈跟踪。您可能会遇到一些未被其他catch块捕获的异常。Mshnik是对的:
    br.close()
    位于
    while
    循环中,因此将在
    while
    循环的每次迭代中调用,这不是您想要的。我猜它找不到文件。问题是,
    newfileinputstream
    会在你进入
    file.exists()
    @Chris Dare之前抛出一个异常(你的
    main
    程序会捕获并忽略它),我得到了数组列表的大小,让我知道如果你想,我可以发布我的答案,我可以向你解释一下发生了什么,这修复了我在运行时遇到的错误:-)。程序运行的方式应该是现在@如果我的回答有帮助,你能告诉我吗
    static List<Igal> cards = new ArrayList<>();
    static File file = new File("C:\\Users\\xxx\\Documents\\NetBeansProjects\\Dictionary\\src\\temp.txt");
    
    public static void fillArray() throws FileNotFoundException, IOException {
    
            FileInputStream fiStream = new FileInputStream(file);
            BufferedReader br = new BufferedReader(new InputStreamReader(fiStream));
            String line;
            String[] seperated;
    
            while ((line = br.readLine()) != null) {
                seperated = line.split(":");
                String foreign = seperated[0];
                String english = seperated[1];
                System.out.println(foreign + " : " + english);
               Igal fc = new Igal(foreign, english);
               cards.add(fc);
          }
     }
    
    public static void main(String[] args) {
        try {
            fillArray();
        } catch (IOException e) {
            System.out.println(e);
        }
        System.out.println("------------------");
        for (Igal card : cards) {
            System.out.println(card.toString());
        }
         System.out.print("the size is " + cards.size()+"\n");
    
    Volare : To Fly
    Velle : To Wish
    Facere : To Do / Make
    Trahere : To Spin / Drag
    Odisse : To Hate
    
    ------------------
    Volare   To Fly
    Velle   To Wish
    Facere   To Do / Make
    Trahere   To Spin / Drag
    Odisse   To Hate
    the size is 5