首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以访问类中的变量,但是调用方法会抛出NoClassDefFoundError?

我可以访问类中的变量,但是调用方法会抛出NoClassDefFoundError?
EN

Stack Overflow用户
提问于 2015-08-04 05:26:19
回答 3查看 87关注 0票数 2

我一直得到一个我无法理解的NoClassDefFoundError。我有一个很明显的类,因为我可以访问该类中定义的变量。我已经验证了类的存在,但是当我试图调用我需要的函数时,我会得到一个NoClassDefFoundError。下面是我得到的错误日志:

代码语言:javascript
复制
[INFO_|08/04 08:18:41|MaintenanceCronReport.main:375] Testing :Test Variable
[ERROR|08/04 08:18:41|Cron$CronJob.run:1423] Exception: [CronMaintenance_1min] org.opengts.scheduler.MaintenanceCronReport.main: -account=ALL -db.sql.provider=mysql -db.sql.host=localhost -db.sql.port=3306 -db.sql.dbname=test -db.sql.user=test -db.sql.password=test -smtp.host=smtp.gmail.com -smtp.port=25 -smtp.user=test@test.com -smtp.user.emailAddress=test@test.com -smtp.password= -smtp.enableSSL=true -sendMail=true -saveOnHD=false -pathToTMP=C:\tmp\ -pathToGTS=C:\Users\User\workspace\GTS\ -emailTo=test@test.com -log.include.date=true [*/1 * * * *] {thread}
java.lang.NoClassDefFoundError: org/opengts/war/report/ReportFactory
    at org.opengts.scheduler.MaintenanceCronReport.main(MaintenanceCronReport.java:376)
    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:497)
    at org.opengts.util.MethodAction.invoke(MethodAction.java:389)
    at org.opengts.util.MethodAction.invoke(MethodAction.java:372)
    at org.opengts.extra.util.Cron$CronJob.run(Cron.java:1420)
    at org.opengts.util.ThreadPool$ThreadJob.run(ThreadPool.java:650)
Caused by: java.lang.ClassNotFoundException: org.opengts.war.report.ReportFactory
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 9 more
[INFO_|08/04 08:18:41|Cron$CronJob.run:1426] CronEnd  : [CronMaintenance_1min] org.opengts.scheduler.MaintenanceCronReport.main: -account=ALL -db.sql.provider=mysql -db.sql.host=localhost -db.sql.port=3306 -db.sql.dbname=test -db.sql.user=test -db.sql.password=test -smtp.host=smtp.gmail.com -smtp.port=25 -smtp.user=test@test.com -smtp.user.emailAddress=test@test.com -smtp.password= -smtp.enableSSL=true -sendMail=true -saveOnHD=false -pathToTMP=C:\tmp\ -pathToGTS=C:\Users\User\workspace\GTS\ -emailTo=test@test.com -log.include.date=true [*/1 * * * *] {thread}

完整的代码太长了,不能放在这里,所以我希望本节能够完成。在这里,我可以很好地访问变量TEST_VARIABLE,但是尝试调用下一行的静态方法测试会抛出上面显示的错误。

代码语言:javascript
复制
Print.logInfo("Testing :" +ReportFactory.TEST_VARIABLE);
Print.logInfo(ReportFactory.test());

变量TEST_VARIABLE和方法测试只是简单地定义为:

代码语言:javascript
复制
public static final String TEST_VARIABLE= "Test Variable";
public static String test()
{
    return "TEST METHOD RETURN";
}

任何帮助都是非常感谢的。提前谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-04 05:41:28

JLS§12.4.1。它的部分内容是:

类或接口类型T将在第一次出现以下情况之前立即初始化:. 使用由T声明的静态字段,且该字段不是常量变量(§4.12.4)。

请注意,这意味着如果字段不是常量变量,则类将在第一次访问字段之前被初始化。但是,如果字段是一个常量变量,这一点就不适用了,就像在您的例子中一样。因此,对ReportFactory.test()的调用很可能是适用§12.4.1的第一类访问。这并不能解释为什么要获得异常(首先需要检查类路径),但这应该有助于解释为什么在成功访问TEST_VARIABLE之后会出现此异常。

票数 1
EN

Stack Overflow用户

发布于 2015-08-04 05:32:39

类路径中没有完全的依赖项,请确保将所有必需的jars放入类路径中。

票数 0
EN

Stack Overflow用户

发布于 2015-08-04 09:22:11

我的问题已经解决了。正如预期的那样,我在类路径中丢失了必需的jar文件。感谢所有回复的人。我很感激。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31801285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档