2016-05-22 14 views
0

Ich erhalte eine ClassNotFoundException mit Class.forName() übergibt den voll qualifizierten Namen einer öffentlichen statischen Klasse, die im selben Paket lebt. Dies ist, wenn ich meine Tests durchführe.ClassNotFoundException auf der statischen inneren Klasse

Hier ist der vollständige Stacktrace:

java.lang.AssertionError 
    at org.junit.Assert.fail(Assert.java:86) 
    at org.junit.Assert.assertTrue(Assert.java:41) 
    at org.junit.Assert.assertNotNull(Assert.java:712) 
    at org.junit.Assert.assertNotNull(Assert.java:722) 
    at com.badlogic.ashley.serialization.EntitySerializerTests.read(EntitySerializerTests.java:63) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:27) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

In EntitySerializerTests.java in meinem tests Ordner.

package com.badlogic.ashley.serialization; 
public class EntitySerializerTests { 

    public static class TestComponentA implements Component { 
     public int value; 
    } 

    ... 
} 

In meiner Bibliothek Code

package com.badlogic.ashley.serialization; 
public class EntitySerializer implements Json.Serializer<Entity> { 
    ... 

    private Component read(Json json, JsonValue componentValue) throws ClassNotFoundException { 
     String className = componentValue.name(); 
     Class componentType = Class.forName(className); // THROWS 
     ... 
    } 
} 

Die Ausnahmemeldung ist:

java.lang.ClassNotFoundException: com.badlogic.ashley.serialization.EntitySerializerTests.TestComponentA 

Bibliothek Code versucht, die Class der Name für eine Klasse gegeben zu erhalten, die in einer Testdatei definiert ist . Ist das erlaubt? Ich würde annehmen, dass zur Laufzeit alle diese Klassen im Klassenpfad verfügbar sind.

Danke.

+0

Warum wurde das heruntergeregelt? Kann ich wenigstens einen Grund dafür bekommen? –

+1

Ich habe nicht downvote, aber Sie sollten IMMER die vollständige Stack-Ablaufverfolgung der Ausnahme veröffentlichen, wenn Sie nach einer Ausnahme fragen. Es ist auch nicht klar, ob Sie einen Test oder einen Produktionscode ausführen. Der Stack-Trace würde helfen, das herauszufinden. Wenn Sie Produktionscode ausführen, warum sollten die Testklassen im Klassenpfad sein? –

+0

@JBNizet danke für die Hilfe bei der Verbesserung meiner Frage. Ich habe geklärt, dass dies passiert, wenn Tests ausgeführt und mit dem vollständigen Stacktrace verknüpft werden. –

Antwort

3

Das Problem ist, dass der Klassenname für die Reflexion nicht com.badlogic.ashley.serialization.EntitySerializerTests.TestComponentA, wird com.badlogic.ashley.serialization.EntitySerializerTests$TestComponentA ($ anstelle von . die inneren Klasse aus der einschließenden Klasse zu trennen).

Sie können dies auch überprüfen, wenn Sie den Dateinamen der kompilierten Klasse oder mit EntitySerializerTests.TestComponentA.class.getName() betrachten.

Verwandte Themen