我当前的代码还不完整,但是我要做的是让我的方法readDataFromFile
读取包含动物(名称,物种等)的文件并将其添加到我的Zoo
中使用扫描仪。
我有 2 个课程: Zoo
和Animal
我在此行有一个错误:
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;
}
}
答案 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类。