作者:shadow | 来源:互联网 | 2023-05-16 23:54
我正在使用SAX解析XML文件,但是当我在类上调用类加载器时,java.lang.InstantiationException
会抛出a。
我通过例外的原因对此进行了调试:“当应用程序尝试使用Class类中的newInstance方法创建类的实例时抛出,但是指定的类对象由于是接口或抽象类而无法实例化。 '
但是location
该类不是接口或抽象类。我还检查了该类是否在正确的包中。
有谁知道为什么在这种情况下会引发异常?
只是在Parser类的startElement中的第一个println之后引发异常:
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if (qName.equals("location")){
location = true;
System.out.println("Found a location...");
//exception thrown after this statement as shown
//in the error output below
try {
//Read in the values for the attributes of the element
int locatiOnID= Integer.parseInt(atts.getValue("id"));
String locatiOnName= atts.getValue("name");
//Generate a new instance of Location on-the-fly using reflection. The statement Class.forName("gmit.Location").newInstance(); invokes the
//Java Class Loader and the calls the null (default) constructor of Location.
Location loc = (Location) Class.forName("gmit.Location").newInstance();
loc.setId(locationID); //Now configure the Location object with an ID, Name, Description etc...
loc.setName(locationName);
} catch (Exception e) {
e.printStackTrace();
}
}else if (qName.equals("description")){
description = true;
System.out.println("Found a description. You should tie this to the last location you encountered...");
}else if (qName.equals("exits")){
exits = true;
System.out.println("Found an exit. You should tie this to the last location you encountered...");
}else if (qName.equals("item")){
item = true;
System.out.println("Found an item. You should tie this to the last game-character you encountered if the boolean gameCharacter flag is true...");
}else if (qName.equals("game-character")){
gameCharacter = true;
System.out.println("Found a game character...");
}else if (qName.equals("search-algorithm")){
searchAlgorithm = true;
System.out.println("Found a search algo. You should tie this to the last game-character you encountered if the boolean gameCharacter flag is true...");
}
}
我完整的位置类别:
http://hastebin.com/yofuyafipe.java
运行时抛出的错误:
http://hastebin.com/jonozeyefe.avrasm
1> Stephen C..:
您的Location
类没有no-args构造函数。(它有两个带有声明参数的构造函数……因此没有默认的无参数构造函数。)
解决方案:
添加一个无参数的构造函数。
反射性地查找Constructor
Location Class
对象上的对象之一,并使用Constructor.newInstance(...)
带有给出实际构造函数参数值的参数的方式调用它。
在这种情况下,第一种选择似乎是更好的选择。。。因为在该点上,您似乎没有所需的参数值。