【问题标题】:Java: Error reading text file to arrayJava:将文本文件读取到数组时出错
【发布时间】:2017-07-24 15:45:02
【问题描述】:

我正在尝试将文本文件读取到 arrayList 但它告诉我

"没有找到适合add(string)方法的方法 Collection.add(Animal) 不适用(参数不匹配;字符串 不能转换为动物)”

我有一个名为 Animal 的类,其中这是我的构造函数代码

    //Constructor
public Animal(String aType, String aColor, boolean aVertebrate, boolean aFly, boolean aSwim) {
    type = aType;
    color = aColor;
    vertebrate = aVertebrate;
    fly = aFly;
    swim = aSwim;

}

在我的主类中,这是我用来读取文本文件的代码

    else if (menuSelection.equalsIgnoreCase("I")){
            Animal a;
            String line;

            try (BufferedReader br = new BufferedReader(new FileReader("animalFile.txt"))){
                if (!br.ready()){
                    throw new IOException();
                }
                while((line = br.readLine()) != null){
                    animalList.add(line);
                }
                br.close();
            }catch (FileNotFoundException f){
                System.out.println("Could not find file");
            }catch (IOException e){
                System.out.println("Could not process file");
            }

            int size = animalList.size();
             for (int i = 0; i < animalList.size(); i++) {
                    System.out.println(animalList.get(i).toString());
             }

我在“animalList.add(line)”上收到错误消息

【问题讨论】:

  • 哪种错误?请发布确切的错误消息。
  • 没有为 add(String) 方法找到合适的方法 Collection.add(Animal) 不适用(参数不匹配;字符串无法转换为 Animal)方法 List.add(Animal) 不适用(参数不匹配;字符串不能转换为动物)方法 AbstractCollection.add(Animal) 不适用(参数不匹配;字符串不能转换为动物)方法 AbstractList.add(Animal) 不适用(参数不匹配;字符串不能转换为动物) 方法 ArrayList.add(Animal) 不适用(参数不匹配;String 无法转换为 Animal)
  • 抱歉,我没有意识到如果按 Enter 键,它会发布评论而不是转到下一行。我编辑了帖子,以便您可以看到完整的消息。
  • @Eduardo 的回答将解决您的问题。

标签: java arraylist netbeans bufferedreader


【解决方案1】:

列表animaListAnimal 的列表。 BufferedReader readLine() 返回String,因此您不能将String 添加到Animal 的列表中。

在这一行中,您应该调用一个将字符串转换为动物对象的方法。

 while((line = br.readLine()) != null) {
     Animal animal = getAnimal(line);
     animalList.add(animal);
 }

方法想:

private Animal getAnimal(String in) {

// Split string and initialize animal object correctly

}

【讨论】:

  • 我以前从未使用过 split 所以我不确定这是否正确,我做了 String s1; s1=animalList.add(new Animal(a.getType(),a.getColor(),String.valueOf(a.isVertebrat‌​e()),String.valueOf(‌​a.canFly()), String.valueOf (a.canSwim())); 但它说“不兼容的类型:字符串不能转换为布尔值”我以为我通过 String.valueof 解决了这个问题?
  • 什么是a?你能提供一个你会得到的示例行吗?
  • a 是对 Animal 类的引用,我将它作为 Animal a;
  • 你能提供一个示例行,我可以给你一些示例代码。
  • 我有一个读取 dog+red+true+true+true 的文本文件,我希望当用户选择导入该文本文件时,控制台会读取 dog red true true true
【解决方案2】:

您还没有显示animalList 是什么,但是从代码中,我推断它是AnimalListbr.readLine() 返回 String ,但您将其添加到 animalList ,它需要 Animal。因此,错误。

【讨论】:

    【解决方案3】:

    我相信“animalList”旨在成为 Animal 类型的对象列表。因此,当您调用animalList.add(line) 时,它会尝试添加一个String 对象(因为line = br.readLine() 从文件中读取一个字符串)而Animal 对象应该被添加。

    你特别需要做的是

    1. 将字符串解析为接受您的 Animal 构造函数(aType、aColor 等)的数据片段
    2. animalList.add(line)修改为animalList.add(new Animal(/*Put parsed parameters here*/))..

    【讨论】:

    • 我以前从未使用过 split 所以我不确定这是否正确,我做了 String s1; s1=animalList.add(new Animal(a.getType(),a.getColor(),String.valueOf(a.isVertebrate()),String.valueOf(a.canFly()),String.valueOf(a.canSwim ())); 但它说“不兼容的类型:字符串不能转换为布尔值”我想我通过 String.valueof 解决了这个问题?
    • @BrookeTaylor valueOf 仅返回原始类型的字符串表示形式。如果您的行代表动物的某些参数,您需要拆分字符串,然后将拆分的部分转换为构造函数接受的类型。您可以使用以下代码将字符串转换为布尔值:Boolean.getBoolean(yourStringValueRepresentingTrueOrFalse)
    • 这是用户输入,因此没有设置字符串值,因为它可以更改。它只是 Boolean.getBoolean(a.isVertebrate()) 吗?
    • @BrookeTaylor 抱歉,我不明白。我认为您的代码从文件中获取字符串并从该文件中填充动物列表。那么,当您说“这是用户输入”时,您是什么意思?
    • 那么用户首先进行用户输入,然后将其导出到一个文本文件,然后用户可以选择导入该文本文件并将这些字符串放入一个数组中以填充动物列表。跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多