活动启动时的android classcastexception

时间:2010-10-01 11:15:39

标签: android android-activity startup classcastexception

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

遗憾的是,调试器没有提供有关它正在尝试投射的类的任何详细信息。

这是stacktrace:

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]  

当我查看runtimeexception时,我得到:

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 {

}

9 个答案:

答案 0 :(得分:24)

  1. 打开AndroidManifest.xml
  2. 查找代码application
  3. 删除属性android:name(如果存在)
  4. 添加属性android:name="android.app.Application"
  5. 这就是我所做的,问题已经消失。

    P.S:在第4步中使用自定义应用程序类名称(如果有的话)(可选)。

答案 1 :(得分:5)

我遇到了同样的问题。

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

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

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

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

答案 2 :(得分:4)

我犯了一个愚蠢的错误,

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

这导致 classcastexception ..

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

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

它有效..

我不知道如何,但我能说的是,这种愚蠢的错误也会导致上述问题。

答案 3 :(得分:2)

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
}

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

答案 4 :(得分:2)

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

如果您允许应用程序在未捕获的异常之后继续执行,您应该会发现在“adb logcat”中获得了一个更有用的堆栈跟踪,而不是在它停止时轻松退出调试器。

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

在我的情况下,它似乎是资源ID之间的不匹配 - 在XML文件中移动东西似乎混淆了这样的事情,当我查看view.findViewById(R.id.something)时它没有返回给我正确的对象。我正在将对象转换为TextView,根据我的XML布局的内容,它应该完全有效,但它崩溃了。

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

答案 5 :(得分:0)

如果使用谷歌地图:

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

记住这一行。无法相信我忘了它,浪费了太多时间。

答案 6 :(得分:0)

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

如果您将ImageButton视图转换为Button View或其他View Class,也会发生这种情况。

答案 7 :(得分:0)

我有同样的问题,我发现,这导致了preferences.xml的错误使用 <CheckBoxPreference android:key="@+id/string" /> 不得不改变 <CheckBoxPreference android:key="string" />

答案 8 :(得分:0)

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