错误捕获:groovy.lang.GroovyRuntimeException:无法运行此脚本或类

时间:2016-07-16 08:49:08

标签: groovy

最近遇到过这个问题 - 当我在一个groovy类中有两个类时,如果main方法类不在顶部我遇到了这个问题。

  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"
    }
}

但是如果改变这两个类的顺序而不是没有错误,那么它是否意味着主要方法类应该在Groovy中处于最顶层?

1 个答案:

答案 0 :(得分:1)

是的,类的顺序在一个groovy脚本中很重要。如果你解析一个groovy脚本并检查它的类名,它将是顶级类,而不是具有main方法的类或与文件名相同的名称。它可以是具体类,抽象类,枚举,接口或特征。

让我们看看你的情况。我们将把您的代码放在GString中,然后尝试使用我们自己的GroovyClassLoader解析它。

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)

当您执行此代码时,它将打印class Book。因为这是脚本中第一个可用的类。

您获得的异常是因为您的顶级类没有主方法,并且您的脚本在加载类后都没有执行的操作。一种解决方案是将TestClass移到顶部,或者只是在文件TestClass.main()的末尾添加另一行,它将毫无问题地执行。