web-dev-qa-db-ja.com

「Java.lang.InstantiationException」を解決するにはどうすればよいですか?

SAXを使用してXMLファイルを解析していますが、クラスでクラスローダーを呼び出すと、Java.lang.InstantiationExceptionがスローされます。

例外の理由でこれをデバッグしました。 'アプリケーションがクラス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

5
Brian J

Locationクラスには引数なしのコンストラクターがありません。 (引数が宣言された2つのコンストラクターがあります...したがって、デフォルトの引数なしコンストラクターはありません。)

ソリューション:

  • 引数なしのコンストラクターを追加します。
  • Location ConstructorオブジェクトのClassオブジェクトの1つを反射的にルックアップし、実際のコンストラクター引数値を与える引数を指定してConstructor.newInstance(...)を使用して呼び出します。

このコンテキストでは、最初のオプションの方が優れているようです... 'コードのその時点で必要な引数値がないようです。

9
Stephen C

スティーブンCに感謝します。

_Caused by: Java.lang.reflect.UndeclaredThrowableException: null
    at org.springframework.util.ReflectionUtils.handleReflectionException(ReflectionUtils.Java:120) ~[spring-core-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper.getBean(BeanWrapperFieldSetMapper.Java:250) ~[spring-batch-infrastructure-4.1.2.RELEASE.jar:4.1.2.RELEASE]
    at org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper.mapFieldSet(BeanWrapperFieldSetMapper.Java:196) ~[spring-batch-infrastructure-4.1.2.RELEASE.jar:4.1.2.RELEASE]
    at org.springframework.batch.item.file.mapping.DefaultLineMapper.mapLine(DefaultLineMapper.Java:43) ~[spring-batch-infrastructure-4.1.2.RELEASE.jar:4.1.2.RELEASE]
    at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.Java:180) ~[spring-batch-infrastructure-4.1.2.RELEASE.jar:4.1.2.RELEASE]
    ... 50 common frames omitted
Caused by: Java.lang.InstantiationException: com.example.batchprocessing.Price
    at Java.lang.Class.newInstance(Class.Java:427) ~[na:1.8.0_131]
    at org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper.getBean(BeanWrapperFieldSetMapper.Java:247) ~[spring-batch-infrastructure-4.1.2.RELEASE.jar:4.1.2.RELEASE]
    ... 53 common frames omitted
_

Priceクラスにpublic Price(){};を追加し、問題を修正しました(BTW、これはSpringbatchベースのアプリです)。

_public class Price {

    private String x;
    private String y;

    public Price(){};

    public price(String x, String y) { this.x = x ; this.y = y; };

~
~
~

}
_
0
zee