类构造函数给我一个错误

时间:2018-07-11 22:18:06

标签: java

我当前的代码还不完整,但是我要做的是让我的方法readDataFromFile读取包含动物(名称,物种等)的文件并将其添加到我的Zoo中使用扫描仪。

我有 2 个课程: ZooAnimal

  

我在此行有一个错误:addAnimal( new Animal(species, name) );

Blue Jay向我解释了为什么它不起作用:

  

“动物类中的构造函数动物不能应用于给定类型;

     

必填:找到Java.lang.String,java.lang.String,MyZoo:   java.lang.String,java.lang.String原因:实际参数和形式参数   列表的长度不同”

动物园等级:

public class MyZoo

{
    private String zooId;
    private int nextAnimalIdNumber;
    private TreeMap<String, Animal> animals;
    private Animal animal;

    public MyZoo(String zooId)
    {
        this.zooId = zooId.trim().substring(0,3).toUpperCase();
        nextAnimalIdNumber = 0;
        animals = new TreeMap<String, Animal>();
    }

    public void addAnimal(Animal animal)
    {
        animals.put(animal.getName(), animal);
        this.animal = animal;
    }


    public void readDataFromFile(String fileName) throws FileNotFoundException
    {  

        JFrame mainWindow = new JFrame();
        FileDialog fileDialogBox = new FileDialog(mainWindow, "Open", FileDialog.LOAD);
        fileDialogBox.setDirectory("."); 
        fileDialogBox.setVisible(true);

        fileName = fileDialogBox.getFile();
        String directoryPath = fileDialogBox.getDirectory();

        File dataFile = new File (fileName);
        Scanner scanner = new Scanner(dataFile);
        zooId = scanner.nextLine();
        System.out.println("ID of the Zoo: " + zooId);
        int noOfAnimalsRead = scanner.nextInt();
        System.out.println("no of animals read from file was " + noOfAnimalsRead + "\n");
        scanner.nextLine();
        while( scanner.hasNext() )
        {
            String name = scanner.next();
            System.out.println("Name of Animal: " + name);
            String species = scanner.next();
            System.out.println("Name of species: " + species);
            String id = scanner.next();
            System.out.println("ID of Animal: " + id);

            addAnimal( new Animal(species, name) );        
            scanner.nextLine() ;
        }
        scanner.close();
    }

}

动物类:

public class Animal
{
    private String id;
    private String species;
    private String name;
    public Animal(String species, String name, MyZoo owner)
    {
        id = owner.allocateId();
        this.species = species;
        this.name  = name;
    }

    public String getId()
    {
        return id;
    }

    public String getName()
    {
        return name;
    }

    public String getSpecies()
    {
        return species;
    }

    public String toString()
    {
        return id + "  " + name + ": a " + species;
    }
}

4 个答案:

答案 0 :(得分:1)

这是构造函数问题,而不是扫描程序问题。

您的Animal构造函数有3个参数。这意味着在while循环中,当您创建新Animal时,需要提供3个参数!解决此问题的唯一方法是重载构造函数(添加一个带有两个参数的新构造函数)。将此添加到您的动物类:

public Animal(String species, String name)
{
    this.species = species;
    this.name  = name;
}

答案 1 :(得分:1)

基于IDE的“解释”,当您创建新的Animal对象时,似乎没有将足够的参数传递给构造函数。期望在种类之上的myZoo类型的对象为String,名称为String。

答案 2 :(得分:1)

Animal类的构造函数需要三个参数(String species, String name, MyZoo owner),而您仅用两个参数来调用它:new Animal(species, name)。提供MyZoo Object或添加新的构造函数:

public Animal(String species, String name){
  this.species = species;
  this.name  = name;
}

由于只需要id对象的MyZoo,因此可以将Animal构造函数更改为:

 public Animal(String species, String name, int zooId){
   this.id = zooId;
  this.species = species;
  this.name  = name;
}

然后您可以像这样实例化Animal

 Animal animal = new Animal(species, name, zooId);

对于您的MyZoo类,您可以通过添加Animal来做到这一点:

 addAnimal( new Animal(species, name, zooId) ); 

答案 3 :(得分:1)

更改此行:

addAnimal( new Animal(species, name) );

对此:

addAnimal( new Animal(species, name, this) );

之所以可行,是因为您的Animal构造函数需要第三个参数,即拥有的动物园。由于包含此代码的方法位于Zoo实例中,因此可以使用this来引用它。

编辑:另一个好处是您不必编辑Animal类。