我在我的应用程序的主要活动如下代码:增加了新的(部分重构后)的代码,现在越来越ClassNotFoundException的一类,它根本不存在
package com.myself.foo.myapp;
import com.someotherfellow.hisapp.OtherClass;
// more imports here
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Object bar = new OtherClass(blah, this, YetAnotherClass.class);
// ...
}
}
当我建立并启动它(使用Eclipse和ADT),该应用程序崩溃,未处理ClassNotFoundException
。该logcat的告诉我缺少的类是
com.myself.foo.myapp.OtherClass
哪位是一个不存在的类。简单的类名是来自其他包的类的名称,但它的前缀是我的包名称。很明显,这个课程永远不会被发现。
当我将鼠标悬停在代码中的构造函数调用OtherClass
上时,Eclipse显示了正确的类名,并带有正确的程序包前缀。
两种封装都存在于同一个源代码树的源文件,相应的路径是:
~/src/myapp/src/com/myself/foo/myapp/MainActivity.java
~/src/myapp/src/com/someotherfellow/hisapp/OtherClass.java
是什么造成这种行为,我怎么能解决这个问题?
编辑:只是出于好奇,我已经重构代码,移动OtherClass
到安卓试图找到它的包。现在,我得到:
java.lang.InstantiationException:java.lang.Class中<com.myself.foo.myapp.OtherClass>没有无参数的构造
这确实是真的,构造的OtherClass
需要三个参数,如调用中提供的。
它看起来像是由于某种原因,JVM调用new OtherClass()
(带有零参数),它与该类的任何已知构造函数都不匹配。如果OtherClass
驻留在不同的包中,则JVM将尝试在当前包中找到名为OtherClass
的类,并具有匹配的构造函数签名。但是,如果OtherClass
位于同一个包中,那么JVM至少会选择正确的类,但显然找不到匹配的构造函数。
这引出了一个问题:什么导致JVM寻找零参数构造函数?
请注意,OtherClass
不是Android组件:它不属于任何属于Android框架的类,并且不在Manifest中的任何位置引用。 OtherClass
是Object
的直接后代,并实现了自定义接口。
编译错误没有到来,所以在编译期间没有运行时间,所以你可以检查运行时间类路径 –
@gatisahu具体应该看什么设置?请注意,这两个包共享相同的根路径(〜/ src/maypp/src),问题似乎是有些东西正在将合格的类名更改为与我将其导入的不同包。 – user149408