【问题标题】:Reading a file into an arraylist of multiple objects java将文件读入多个对象的arraylist java
【发布时间】:2021-03-03 04:54:08
【问题描述】:

所以这是我的主要课程,我基本上是在尝试从 txt 文件中读取项目列表,并尝试将它们存储在多个对象的数组列表中,但由于某种原因,如果我尝试拥有,我会不断收到 inputmissmatch 错误txt 文件中有多行和多个对象,但是假设我有一个包含一行的 txt 并且我将一个对象添加到列表中,它工作得非常好

public static void main(String[] args) throws FileNotFoundException, IOException {
        
                //    FileReader fr = new FileReader("Item2.txt");
                Scanner file = new Scanner(new File("item.txt"));
                ArrayList<Item> List = new ArrayList<Item>();
             
                   List.add(new ClothingItem(file.next().charAt(0), file.next(), file.next(), file.nextInt(), file.next(), file.nextDouble(), file.nextInt()));
                    List.add(new ClothingItem(file.next().charAt(0), file.next(), file.next(), file.nextInt(), file.next(), file.nextDouble(), file.nextInt()));
                    List.add(new Computer(file.nextInt(), file.next(), file.nextDouble(), file.nextInt(), file.next(), file.next(), file.next(), file.nextDouble(), file.nextDouble()));
                    List.add(new FoodItem(file.nextDouble(), file.next(), file.nextInt(), file.next(), file.nextDouble(), file.nextInt()));
                    List.add(new FoodItem(file.nextDouble(), file.next(), file.nextInt(), file.next(), file.nextDouble(), file.nextInt()));
                    List.add(new Beverages(file.nextInt(), file.next(), file.nextInt(), file.next(), file.nextDouble(), file.nextInt()));
           
        
                ClothingItem[] list1 = List.toArray(new ClothingItem[List.size()]);
                ClothingItem[] list2 = List.toArray(new ClothingItem[List.size()]);
                Computer[] list3 = List.toArray(new Computer[List.size()]);
                FoodItem[] list4 = List.toArray(new FoodItem[List.size()]);
                FoodItem[] list5 = List.toArray(new FoodItem[List.size()]);
                Beverages[] list6 = List.toArray(new Beverages[List.size()]);
        
                for (Item A : List) {
                    System.out.println(A);
         }
                
            }
        }  

正在尝试读取的文件

M RED MALE 1001 Shirt 19.0 100
L BLACK FEMALE 1002 Shoes 49.0 25   
1003 Thinkpad 1050.0 2 Samsung i710610U SMEF 8.0 512.0
5.0 NotFresh 1004 GreenPeas 3.0 117 
5.0 Fresh 1005 Lettuce 2.0 90 
1006 NotAlcholic 1981 Cola 3.0 50  

【问题讨论】:

  • 你的文件总是一样的吗?如果你想这样做,你的文件每次都必须具有相同的格式。另外你为什么使用Scanner?这种类型的任务有更好的选择
  • 您可以为要放入的对象添加代码吗? IE 项目、服装项目、计算机、食品项目、饮料?另外,文件中的每一行是否代表它自己的对象?您是否尝试读取文件的每一行,将其作为对象处理,然后读取下一行?我很困惑你到底想做什么..
  • 您应该逐行读取文件,将每一行拆分为标记并将该行转换为对象。乍一看,该文件包含 6 行,但代码尝试创建 7 个对象,只有 1 个计算机条目。另一个大问题是您不检查文件的结尾(只有一个 hasNext 用于大量 next/nextInt/nextDouble
  • 这能回答你的问题吗? Scanner is skipping nextLine() after using next() or nextFoo()? 这是所呈现代码 sn-p 中多个错误的另一个来源。
  • @cheshire,我可以创建不同的 txt 文件,但是,并非所有类都具有相同的属性,例如计算机有 9 个属性,而服装项目有 7 个,不用说两者都有完全不同的类型

标签: java file arraylist


【解决方案1】:

使用时出现此错误

file.nextInt() or file.nextDouble()

在下一个不是整数也不是双精度值的值上。 在您的代码行中,字符串以 nextInt() 或 nextDouble() 结尾,这会导致错误。

你犯了两个错误。

1)第一个错误是你有1行与你的数据不对应。

        List.add(new Computer(file.nextInt(), file.next(), file.nextDouble(), file.nextInt(), file.next(), file.next(), file.next(), file.nextDouble(), file.nextDouble()));

这是循环中的第四行。此行会导致冲突,因为它被设计为与文本文件的第三行一起运行,但在这行代码中,我们在文本文件的第四行使用它。只需将其注释掉或删除即可。

2)最后一个错误出现在代码的最后 3 行。您使用以下方法: file.hasNext()

hasNext 返回一个布尔值,告诉我们在当前位置之后是否还有更多数据,但它不会转到下一个值。这个错误的原因是,例如当我们再次调用 next() 时,我们应该得到一个字符串,但是你调用了 hasNext(),它并没有移动到下一个值。因此,当您调用 nextInt 时,我们会得到一个字符串,因为我们的 next() 值是一个字符串。

change hasNext() to next()

如果您手动引用每个值,也不需要 while 循环。

另外,打印项目值的 while 循环只会打印无用的对象字符串。

【讨论】:

  • 您好,感谢您的回答,我修复了您指出的几乎所有内容,但是错误仍然存​​在,当我在 txt 文件中只有一行时,它运行得很好,例如一个文件具有以下1003 LenovoThinkpad 1050 2 Samsung i7-10610U SM123 8 512 并且只有 & int main 只有一个计算机对象。但是,当您开始有多行时,它根本就不起作用
  • 编辑问题以匹配我目前拥有的代码
  • 你的代码和我一起工作,仍然得到同样的错误。
  • 它在 java.util.ArrayList.toArray(ArrayList.java:408) 的 java.lang.System.arraycopy(Native Method) 的线程“main”java.lang.ArrayStoreException 中给出以下错误异常) 在 assignment.Assignment.main(Assignment.java:34)
  • 你能指出代码中哪一行是第 34 行吗?
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2011-07-17
  • 2017-10-24
  • 2017-09-08
  • 1970-01-01
  • 2019-04-27
相关资源
最近更新 更多