12

我在 android 中有一个简单的活动程序。基本上这个类只是扩展了 Activity。但是当我启动它时,我在我的类的构造函数中得到一个 ClassCastException 。我什至没有定义构造函数,所以它必须在超类的构造函数中,即 Activity。

不幸的是,调试器没有提供任何关于它试图强制转换的类的详细信息。

这是堆栈跟踪:

Thread [<1> main] (Suspended (exception RuntimeException))  
    ActivityThread$PackageInfo.makeApplication(boolean, Instrumentation) line: 649  
    ActivityThread.handleBindApplication(ActivityThread$AppBindData) line: 4232 
    ActivityThread.access$3000(ActivityThread, ActivityThread$AppBindData) line: 125    
    ActivityThread$H.handleMessage(Message) line: 2071  
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
    Looper.loop() line: 123 
    ActivityThread.main(String[]) line: 4627    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 521  
    ZygoteInit$MethodAndArgsCaller.run() line: 868  
    ZygoteInit.main(String[]) line: 626 
    NativeStart.main(String[]) line: not available [native method]  

当我查看运行时异常时,我得到:

detailMessage "Unable to instantiate application com.test.MyApp: java.lang.ClassCastException: com.test.MyApp" (id=830067694464)

唯一的代码是

package com.test;
import android.app.Activity;
public class MyApp extends Activity {

}
4

9 回答 9

24
  1. 打开AndroidManifest.xml
  2. 查找标签application
  3. 删除属性android:name(如果存在)
  4. 添加属性android:name="android.app.Application"

这就是我所做的,问题已经消失了。

PS:如果您有,请在第 4 步中使用您的自定义应用程序类名称(这是可选的)。

于 2010-10-17T12:37:15.303 回答
5

我有同样的问题。

在我的例子中,我有一个扩展应用程序的类,它在清单文件中作为应用程序标记的属性被引用。

当我重构类时,Eclipse 没有在清单中包含引用(可以理解,但令人沮丧和令人困惑),这导致了这个问题。

这也与马克西姆的回答有关,但解释似乎是差异。

当我更改属性名称以匹配我重命名的文件时,问题已解决。

于 2011-02-13T19:06:53.610 回答
4

我犯了一个愚蠢的错误,

my_textView = (<b>Button</b>) findViewById(R.id.tvMyTextView);

这导致了classcastexception ..

我把它改成了显而易见的,

my_textView = (<b>TextView</b>) findViewById(R.id.tvMyTextView);

它奏效了..

我不知道怎么做,但我只能说,这种愚蠢的错误也会导致上述问题。

于 2012-05-16T16:23:53.190 回答
2
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
}

添加此内容并发布您的完整 Manifest.xml

于 2010-11-10T20:16:58.230 回答
2

我偶尔会遇到同样的问题,有时显然是由在 XML 布局中重新排序项目触发的。

如果您允许应用程序在未捕获的异常之后继续执行,您应该会发现在“adb logcat”中获得的堆栈跟踪比在调试器停止时轻松退出调试器的帮助要大得多。

这通常会将您指向实际发生异常的位置,这通常不是它在调试器中停止的位置。

就我而言,这似乎是资源 ID 之间的不匹配——在 XML 文件中四处移动似乎会使事情变得混乱,以至于当我执行 view.findViewById(R.id.something) 时,它没有返回正确的对象。我将对象转换为 TextView,根据我的 XML 布局的内容,它应该是完全有效的,但它崩溃了。

您可能会发现您实际上有一个错误,您正在执行无效转换,这肯定会导致发生此异常,但在我的情况下,强制清理和重建解决了问题 - 它从头开始重新生成编译的布局和资源 ID ,一切都按预期工作。

于 2014-01-07T15:37:44.740 回答
0

如果使用谷歌地图:

<uses-library android:name="com.google.android.maps" /> 

记住这一行。不敢相信我忘记了,浪费了这么多时间。

于 2011-12-09T12:15:33.787 回答
0

我同意 Mahesh 的回答。这将由于分配视图而不进行投射而发生...

如果您将 ImageButton View 投射到 Button View 或其他一些 View Class,也会发生这种情况。

于 2012-09-22T20:35:38.850 回答
0

我遇到了同样的问题,我发现这导致preferences.xml <CheckBoxPreference android:key="@+id/string" /> 中的错误使用必须更改为 <CheckBoxPreference android:key="string" />

于 2013-03-13T10:37:43.940 回答
0

ClassCastException 有类似的问题,告诉我无法将 EditText 转换为 TextView。我没有尝试。试图清理项目,但收到几个“无法删除文件...”错误。关闭 Eclipse,重新打开它,清理项目。问题消失了。显然,这并非在所有情况下都有效,但这是一种可能性。

于 2014-08-31T00:35:40.883 回答