将文件读入多个java对象的arraylist

将文件读入多个java对象的arraylist,java,file,arraylist,Java,File,Arraylist,这是我的主要类,我基本上试图从一个txt文件中读取一个项目列表,并试图将它们存储在一个包含多个对象的arraylist中,但由于某种原因,如果我试图在txt文件中包含多行和多个对象,我会不断收到inputmissmatch错误,但是,假设我有一个txt,它只有一行&我在列表中添加了一个对象,它工作得非常好 public static void main(String[] args) throws FileNotFoundException, IOException {

这是我的主要类,我基本上试图从一个txt文件中读取一个项目列表,并试图将它们存储在一个包含多个对象的arraylist中,但由于某种原因,如果我试图在txt文件中包含多行和多个对象,我会不断收到inputmissmatch错误,但是,假设我有一个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);
         }
                
            }
        }  

使用时会发生此错误

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

你犯了两个错误

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循环只会打印对象字符串,这是没有帮助的。

您的文件总是相同的吗?如果你想这样做,你的文件每次都必须有相同的格式。还有,为什么要使用
扫描仪
?对于这种类型的任务,有更好的替代方案。您可以为要将这些任务放入的对象添加代码吗?IE项目,服装项目,电脑,食品,饮料?此外,文件中的每一行都代表它自己的对象吗?您是否试图读取文件的每一行,将其作为对象处理,然后读取下一行?我搞不懂你到底想做什么..你应该逐行读取文件,把每一行分割成记号,然后把这一行转换成对象。乍一看,该文件包含6行,但代码试图创建7个对象,只有1个计算机条目。另一个大问题是您没有检查文件的结尾(对于大量的
next/nextInt/nextDouble
,只有一个
hasNext
),这是否回答了您的问题?这是出现的代码段中多个错误的另一个原因。@cheshire,我可以用不同的方式创建txt文件,但是,并非所有类都有相同的属性,例如计算机有9个属性,衣服项目有7个,不用说两者都有完全不同的类型Shello,谢谢你的回答,我几乎修复了您指出的所有错误,但是错误仍然存在,当我在txt文件中只有一行时,它运行得非常好,例如,一个文件包含以下
1003 LenovoThinkpad 1050 2 Samsung i7-10610U SM123 8 512
和仅&int main计算机的一个对象。但是,当您开始有多行代码时,它只是无法将问题编辑为与我当前使用的代码相匹配。您的代码仍然会收到相同的错误。它在java.lang.System.arraycopy(本机方法)的线程“main”java.lang.ArrayStoreException中给出以下错误异常在assign.assignment.main(assign.java:34)的java.util.ArrayList.toArray(ArrayList.java:408)中,您能否指出代码中哪一行是第34行。
change hasNext() to next()