如何解决“ java.lang.InstantiationException”?

Bri*_*n J 5 java xml sax classloader instantiationexception

我正在使用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...");
        }
    }
Run Code Online (Sandbox Code Playgroud)

我完整的位置类别:

http://hastebin.com/yofuyafipe.java

运行时抛出的错误:

http://hastebin.com/jonozeyefe.avrasm

Ste*_*n C 8

您的Location类没有no-args构造函数。(它有两个带有声明参数的构造函数……因此没有默认的无参数构造函数。)

解决方案:

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

在这种情况下,第一种选择似乎是更好的选择。。。因为在该点上,您似乎没有所需的参数值。