2016-07-16 5 views
1

Kürzlich mit diesem Problem aufgetreten - wenn ich zwei Klasse in einer groovigen Klasse hatte, wenn die Hauptmethode Klasse nicht auf der Oberseite ist, stieß ich auf dieses Problem.Fehler Caught: groovy.lang.GroovyRuntimeException: Dieses Skript oder diese Klasse konnte nicht ausgeführt werden

class Book { 

    private String name 
    void setName(String bookName) { 
     name=bookName 
     print "Book Name => "+bookName+"\n"; 
    } 

    String getName(){ 
     return name; 
    } 
} 


class TestClass { 
    static main(args) { 
     Book t = new Book(); 
     t.setName("First Book"); 
     print "book title=>"+t.getName()+"\n" 
    } 
} 

aber ändern, wenn die Reihenfolge dieser beiden Klasse als kein Fehler vorhanden ist, bedeutet es, Hauptmethode Klasse an der Spitze in Groovy sein sollte?

+0

Wie heißt die Datei? –

+0

TestClass.groovy –

+0

Und wie läuft es? –

Antwort

0

Ja, Reihenfolge der Klassen in einem groovigen Skript wichtig. Wenn Sie ein grooviges Skript analysieren und seinen Klassennamen überprüfen, wäre es die oberste Klasse und nicht die mit der Hauptmethode oder einer, die denselben Namen wie der Name der Datei haben. Es könnte eine konkrete Klasse, eine abstrakte Klasse, ein Enum, eine Schnittstelle oder ein Merkmal sein.

Lass uns deinen Fall sehen. Wir werden Ihren Code in ein GString setzen und dann versuchen, es mit unserer eigenen GroovyClassLoader zu analysieren.

String script = """ 
class Book { 
    private String name 
    void setName(String bookName) { 
     name=bookName 
     print "Book Name => "+bookName+"\\n"; 
    } 

    String getName(){ 
     return name; 
    } 
} 


class TestClass { 
    static main(args) { 
     Book t = new Book(); 
     t.setName("First Book"); 
     print "book title=>"+t.getName()+"\\n" 
    } 
} 
""" 

GroovyClassLoader loader = new GroovyClassLoader() 
GroovyCodeSource codeSource = new GroovyCodeSource(script, "MyClass", GroovyShell.DEFAULT_CODE_BASE) 
println loader.parseClass(codeSource) 

Wenn Sie diesen Code ausführen wird wird es class Book drucken. Weil dies die erste verfügbare Klasse in Ihrem Skript ist.

Die Ausnahme Sie bekommen ist, weil das Ihre Top-Level-Klasse kein Hauptverfahren haben und weder das Skript etwas auszuführen, nachdem Sie Ihre Klassen geladen haben. Eine Lösung besteht darin, TestClass oben zu verschieben oder einfach eine weitere Zeile am Ende der Datei TestClass.main() hinzuzufügen, und es wird ohne irgendwelche Probleme ausgeführt.