5

我正在使用 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 <location>
                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

4

1 回答 1

12

您的Location类没有无参数构造函数。(它有两个带有声明参数的构造函数……所以没有默认的无参数构造函数。)

解决方案:

  • 添加一个无参数构造函数。
  • 反射性地查找ConstructorLocation 对象上的对象之一,并使用提供实际构造函数参数值的参数Class调用它。Constructor.newInstance(...)

看起来第一个选项在这种情况下更好......'因为看起来你在代码中没有所需的参数值。

于 2015-03-22T01:19:27.933 回答