安卓应用启动时出现类转换异常

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 "无法实例化应用程序com.test.MyApp:java.lang.ClassCastException: com.test.MyApp" (id = 830067694464)

唯一的代码是

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

}

请您在这里添加程序代码,好吗? - Sergey Glotov
1
无法理解上面的内容。请发布您的程序代码。 - Umesh
3
@clamp:忽略异常,让Android收集堆栈信息。在DDMS视角下的LogCat窗格中查看它,这可能会提供更多有关正在发生的情况的信息。 - CommonsWare
编辑:我已经发布了代码,但我认为问题不在那里,因为它在Android活动的构造函数内崩溃。 - clamp
也许如果你在onCreate方法中调用了super.onCreate方法 - Dominic
显示剩余2条评论
9个回答

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

我这样做后问题就解决了。

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


2
已编辑答案,希望更加清晰明了。是的,我确切地指的是 "android.app.Application"。 - Maxim Kachurovskiy
好的,突然间我又遇到了同样的问题,但是这次你的修复方法没有起作用 :( - clamp
这次报错是ClassNotFoundException。 - clamp
5
有人能解释一下为什么会发生这种情况吗?ClassCastException与清单文件中的属性有什么关系?这是否已被报告为错误? - WeNeigh
在我的应用程序中,android:name=".MainActivity"。我进行了更改,但没有起作用,然后改回来一切正常。Eclipse或Android确实是水星... - xji
显示剩余3条评论

5
我有同样的问题。
在我的情况下,我有一个扩展应用程序的类,该类被引用为应用程序标记的属性在清单文件中。
当我重构了这个类时,Eclipse没有包括清单中的引用(可以理解但令人沮丧和困惑),导致了这个问题。
这也与Maxim的答案相关,但解释似乎存在差异。
当我将属性名称更改为匹配我重命名的文件时,问题得到解决。

我知道这个问题很老了,但是我发帖的目的是为了帮助未来可能遇到此类问题的其他人。 - slipp3ry
非常有帮助。面临相同的问题,你能帮我解决这个问题吗? - Sreeram

4

我犯了一个很傻的错误,

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

这导致了ClassCastException..

我将其更改为显而易见的内容,

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

它起作用了...

我不知道是怎么回事,但我只能说这样的愚蠢错误也可能导致上述问题。


是的,这非常正确!当我需要ImageButton而不是Button时,我花了大约三个小时来解决所有这些错误,并且在这篇文章中出现的所有错误都消失了! - WebDevDanno

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

        setContentView(R.layout.main);
}

请添加以下内容并发布您的完整Manifest.xml文件


2

我曾经遇到同样的问题,有时候是在重新排列XML布局元素后引发的。

如果你允许应用在未捕获异常后继续执行,你会发现通过 "adb logcat" 获取出的堆栈跟踪比在调试器停止运行处轻松得多。

这通常会指向实际发生异常的位置,而这通常不是调试器停止运行的位置。

在我的情况下,似乎是资源ID不匹配 - 在XML文件中移动元素似乎会使事情变得混乱,因此当我执行view.findViewById(R.id.something)时,它没有将正确的对象返回给我。我将对象强制转换为TextView,根据我的XML布局内容来看,它应该是完全有效的,但它还是崩溃了。

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


是的,我也遇到了完全相同的情况。清理了项目后就可以了。 - akshay7692

0
如果使用谷歌地图:
<uses-library android:name="com.google.android.maps" /> 

记住这行代码。真不敢相信我居然忘了它,浪费了那么多时间。


0
我曾经遇到过同样的问题,后来发现是由于在 preferences.xml 中使用不当导致的。 <CheckBoxPreference android:key="@+id/string" /> 必须更改为 <CheckBoxPreference android:key="string" />

0

我曾经遇到过一个类转换异常的问题,告诉我无法将EditText强制转换为TextView。但我并没有尝试这样做。我试图清理项目,但收到了几个“无法删除文件…”的错误。关闭Eclipse,重新打开它,再次清理项目。问题消失了。显然这种方法并不适用于每种情况,但这是一种可能性。


0

我同意Mahesh的答案... 这将会发生是因为没有进行强制类型转换就进行视图赋值...

如果您将ImageButton视图转换为Button视图或其他视图类,这也会发生相同情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接