Java.lang.RuntimeException: 无法实例化活动组件信息。

192

我在尝试运行示例代码时,在Android 1.5模拟器中启动应用程序时,遇到了以下错误....有没有人能提供一些线索..?

来自LogCat的错误:

01-13 02:28:08.392: ERROR/AndroidRuntime(2888): FATAL EXCEPTION: main
01-13 02:28:08.392: ERROR/AndroidRuntime(2888): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.s.android.test/com.s.android.test.MainActivity}: java.lang.ClassNotFoundException: com.s.android.test.MainActivity in loader dalvik.system.PathClassLoader[/data/app/com.s.android.test-2.apk]
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1544)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at android.os.Looper.loop(Looper.java:123)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at android.app.ActivityThread.main(ActivityThread.java:3647)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at java.lang.reflect.Method.invokeNative(Native Method)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at java.lang.reflect.Method.invoke(Method.java:507)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at dalvik.system.NativeStart.main(Native Method)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888): Caused by: java.lang.ClassNotFoundException: com.s.android.test.MainActivity in loader dalvik.system.PathClassLoader[/data/app/com.s.android.test-2.apk]
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1536)
01-13 02:28:08.392: ERROR/AndroidRuntime(2888):     ... 11 more
01-13 02:28:08.407: WARN/ActivityManager(112):   Force finishing activity com.s.android.test/.MainActivity

编辑 这个错误经常发生在初学者身上,问题在于你必须在Manifest文件中添加所有的活动(Activity)。


谢谢Dan Breslau...现在看起来更好了..怎么做到的? - rahul
1
对不起,各位...很抱歉浪费了你们的时间...我只是忘记将新类添加到清单文件中了。 - rahul
1
更新所有工具(Eclipse和SDK Manager)解决了我的问题,同时将Android支持库添加到项目中也有帮助。 - Hayden Thring
我有这个问题,请看这里 http://stackoverflow.com/questions/30473270/why-this-runtime-is-occurd-unable-to-instantiate-activity-componentinfo - DanialAbdi
47个回答

178

这是一个与你的Intent有关的问题。

请在你的AndroidManifest.xml中添加你的Activity

当你想要创建一个新的Activity时,你需要在你的AndroidManifest.xml中注册它。


5
我有一个类,它不继承 Activity,只包含一些常用函数;但我仍然遇到了这个异常。为什么? - Manoj Kumar
在我的项目中,查看XML文件中的android:name时,它显示该类不是公共的。当我在主活动中的类之前添加public时,应用程序可以正常运行。很奇怪。 - Codebeat
我在开发一个本地应用程序时遇到了这个问题。我在活动类中添加了另一种方法,然后开始出现这个错误。对我来说,清理+重建解决了这个问题。 - ashishsony
12
另一个选项是您的活动在清单中,但被声明为“抽象”(我在重构期间犯了这个错误,而错误消息并没有提供太多帮助)。 - Czechnology
我该怎么做? - RedGuy11
如何将一个活动添加到清单中? - undefined

76

你可能正在试图查找 onCreate() 之前的视图,这是不正确的。

public class MainActivity extends Activity {

  ImageView mainImage = (ImageView) findViewById(R.id.imageViewMain); //incorrect

  @Override
  protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
  ...
}

3
谢谢你,你真是救命恩人。虽然这很傻,但非常感谢你。这件事已经困扰了我一个星期了。 - meain
做了同样的错误 ;) - Sumit Jha
同样的错误在这里也出现了。谢谢。 - Pooja
请注意,这不是问题中堆栈跟踪错误的解决方案。如果这是你的问题,你会看到不同的堆栈跟踪。 - undefined

74

获取 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo 异常的另一种方式是你尝试启动的活动是抽象的。我曾经犯过这个愚蠢的错误,很容易被忽视。


18
同时,该活动必须是公开的(这是我的错误)。 - djjeck
抱歉打扰您两年后,但我想知道为什么无法启动抽象活动? - BenjaminFranklin
2
@BenjaminFranklin 抽象类意味着它不完整,缺少部分。在类名前加上关键字 abstract 意味着它不能直接实例化,而只能通过继承:其他类实现抽象类的缺失特征。 - Kit10
我已经继承了抽象类,但仍然无法工作。您能否进一步解释一下? - Mohammedsalim Shivani

54

在我的情况下,我忘记添加谷歌地图库

<application>
    ....

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

此外,请检查您在活动路径之前是否漏掉了前导点。

<activity android:name=".activities.MainActivity"/>

2
谢谢你,@Maragues!! 这正是我的问题!你解决了我的问题。 :) - cmcromance

30

这可能与实际问题无关,但在我的情况下,我尝试实现Kotlin并省略了 apply plugin: 'kotlin-android'。错误发生是因为它无法识别MainActivity作为.kt文件。

希望能对某人有所帮助。


2
在主 build.gradle 中添加 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION" - Rajkiran
应用插件:'kotlin-android' 对我很有效。 - sarankumar

27

图片

这也是因为这个问题而发生的。我取消了需要导出到apk的JAR文件,然后就发生了同样的事情。请勾选您的应用程序运行所需的JAR文件。


重要的是要注意这个问题,并正确地尝试每个依赖组件。例如,在Android Studio(或Intellij IDEA)中为依赖项选择正确的范围(提供,编译,...)。在我的情况下,将Provided更改为Compile就可以正常工作了。 - dayanruben

15

我也曾遇到过这个问题,但是情况略有不同。这是我的情况:

应用程序详情:

  • 使用 ActionBarSherlock 作为库
  • 在 ActionBarSherlock 库中使用 android-support-v4-r7-googlemaps.jar,以便在主项目中使用“地图片段”
  • 将该 jar 添加到主项目的构建路径中
  • 在库项目和主项目的清单中都包含 <uses-library android:name="com.google.android.maps" />(在库中可能不需要)
  • 主项目的清单中具有正确的活动定义和所有适当的属性
  • 我没有抽象活动或其他与此问题有关的 Stack Overflow 上看到的障碍。

但是,我仍然遇到了原帖中描述的错误,并且无法使其消失。但是,该问题在一个方面稍有不同:

  • 它只影响将应用程序首次安装到我的设备上。每次首次安装应用程序时,我都会收到由“FragmentActivity”的超类无法解析引起的错误之前数个“警告”
  • 这些警告追溯到 ActionBarSherlock 库
  • 应用程序会强制关闭并崩溃。
  • 如果我立即重新构建和重新部署应用程序,则它会正常工作。
  • 唯一崩溃的时间是在全新安装时。如果我卸载了应用程序,从 Eclipse 构建和重新部署,则会崩溃。第二次构建/部署,它就可以正常工作。

我是如何解决它的:

  • 在 ActionBarSherlock 库项目中,我将 android-support-v4-r7-googlemaps.jar 添加到构建路径中
  • 仅此步骤并不能解决问题

  • 一旦将 jar 添加到构建路径中,我必须更改 Java Build Path > Order and Export 标签上的顺序 - 将 JAR 设置为列表中的第一项(在 /src 和 /gen 项之后)。

  • 我随后重新构建和部署了应用程序到我的设备上 - 在新安装的情况下正常工作。为确保,我又卸载了2-3次并重新安装 - 仍然如预期地工作。

  • 这可能是一个完全的新手错误,但我花了很长时间来查找帖子和代码以找出解决方法,所以希望对其他人有所帮助。也许不适用于所有情况,但在这种特定情况下,这最终成为了我的问题的解决方案。


    谢谢!当我在使用Google AdMob SDK示例“adcatalog”时遇到问题并出现错误时,这对我很有帮助。一个重要的提示是要检查库旁边的复选框。在我的情况下,是支持和AdMob SDK Jars。 - jsmars

    11

    这个错误也可能是一个愚蠢错误的终极标志(比如当我——我是说,咳咳,比如我的一个朋友曾经向我展示他们的代码),他们尝试在方法之外执行代码,就像试图做这样的事情:

    这个错误也可能是一个愚蠢错误的终极标志(比如当我——我是说,咳咳,比如我的一个朋友曾经向我展示他们的代码),他们尝试在方法之外执行代码,就像试图做这样的事情:

    SQLiteDatabase db = openOrCreateDatabase("DB", MODE_PRIVATE, null); //trying to perform function where you can only set up objects, primitives, etc
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
    ....
    }
    

    而不是这个:

    SQLiteDatabase db;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
    db = openOrCreateDatabase("DB", MODE_PRIVATE, null);
    ....
    }
    

    1
    非常有帮助。解决了我的问题,并带领我创建了我的第一个完全功能的安卓应用程序。 - TheUnCola

    8

    对于我来说,我的AndroidManifest.xml文件中的包名字符串是错误的(从教程中复制的)。请确保此文件中的包名与您的主要活动所在的位置相同,例如:

     package="com.example.app"
    

    一个简单的方法是在“清单”选项卡中打开AndroidManifest.xml文件,然后在Package旁边的文本框中输入它,或使用浏览按钮。

    此外,我的活动的包字符串是错误的,例如:

    <activity android:name="com.example.app.MainActivity" android:label="@string/app_name">
    

    我(愚蠢地)在几周后重命名了我的包名,结果又遇到了同样的错误。如果你也要这么做,请确保更新AndroidManifest.xml文件。


    1
    我在Flutter中犯了同样的错误。我更改了包名称,但只更改了AnroidManifest.xml文件中的名称。您必须在项目的多个其他位置进行更改。只需使用Ctrl + Shift + F查找旧的包名称并在所有位置进行更改即可。 - Zciurus

    7
    我通过删除项目中的 Bin Gen 文件夹(当项目构建时自动回来)并从 ->菜单 ->项目 ->清理中清理项目来解决了这个问题。
    谢谢。

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