Android 12 源码编译Apk 新建工程启动报NullPointerException

Android 12兼容问题:新手MainActivity崩溃与AppCompat主题的使用指南
本文讲述了在Android 12环境下,新创建的MainActivity遇到NullPointerException的问题,解决过程包括检查兼容性问题、尝试AppCompatActivity和正确设置Theme.AppCompat。最后,作者分享了解决方案和必要的主题配置技巧。

 Activity代码如下,就是一个纯净的新建MainActivity,继承自Activity。

布局文件如下

Android.mk编写如下,

 然而启动后会报如下NullPointerException,就很奇怪,查了很久,原来是因为在Android12的版本比较高了,出了兼容问题。

11-04 03:45:57.786  4985  4985 E test    : onCreate:App 
11-04 03:45:57.805  4985  4985 E AndroidRuntime: FATAL EXCEPTION: main
11-04 03:45:57.805  4985  4985 E AndroidRuntime: Process: com.example.myapplication, PID: 4985
11-04 03:45:57.805  4985  4985 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3707)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3864)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2253)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.os.Looper.loopOnce(Looper.java:201)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:288)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7870)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at com.android.internal.app.WindowDecorActionBar.getDecorToolbar(WindowDecorActionBar.java:247)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at com.android.internal.app.WindowDecorActionBar.init(WindowDecorActionBar.java:199)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at com.android.internal.app.WindowDecorActionBar.<init>(WindowDecorActionBar.java:173)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.Activity.initWindowDecorActionBar(Activity.java:3509)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.Activity.setContentView(Activity.java:3527)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at com.example.myapplication.MainActivity.onCreate(MainActivity.java:11)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:8059)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:8039)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1341)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3688)
11-04 03:45:57.805  4985  4985 E AndroidRuntime: 	... 12 more

检查了半天,没有发现哪里有错啊,这就搞不懂了,于是就尝试着就尝试着继承一下比较新的AppCompatActivity

 再依赖一下所在的包androidx.appcompat_appcompat

 进行编译却报了如下错,java.lang.IllegalStateException: You need to use a Theme.AppCompat theme

11-04 03:46:07.195  5129  5129 E test    : onCreate:App 
11-04 03:46:07.228  5129  5129 E ThemeUtils: View class androidx.appcompat.widget.AppCompatImageView is an AppCompat widget that can only be used with a Theme.AppCompat theme (or descendant).
11-04 03:46:07.233  5129  5129 E AndroidRuntime: FATAL EXCEPTION: main
11-04 03:46:07.233  5129  5129 E AndroidRuntime: Process: com.example.myapplication, PID: 5129
11-04 03:46:07.233  5129  5129 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3707)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3864)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2253)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.os.Looper.loopOnce(Looper.java:201)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:288)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:7870)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:845)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:808)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:695)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at com.example.myapplication.MainActivity.onCreate(MainActivity.java:39)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:8059)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:8039)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1341)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3688)
11-04 03:46:07.233  5129  5129 E AndroidRuntime: 	... 12 more

在AndroidManifest.xml中添加一个Theme.AppCompat类型的theme,如下是一个白天黑夜模式的主题。

android:theme="@style/Theme.AppCompat.DayNight"

 再次进行编译,终于编译通过了,启动也不会报错了。

<think>嗯,用户遇到了Android Studio编译时的NullPointerException问题,需要解决方案。首先,我得回想一下常见的NPE原因。根据用户提供的引用[^1]和[^2],比如空数组访问和对象未初始化导致的调用方法失败。 首先,用户的问题可能出现在变量未初始化。比如,引用[^1]中提到空数组访问,可能是在使用数组前没有检查是否为null。这时候需要检查所有数组或集合的初始化情况,尤其是动态加载资源的情况。 其次,用户可能在使用findViewById时没有正确获取控件,导致对象为null。比如引用[^2]中的Button的setOnClickListener调用在空对象上。这时候要确认布局文件中的ID是否正确,或者是否在setContentView之后才调用findViewById。 另外,数据传递过程中可能出现的空值,比如Intent传递数据时没有正确处理。需要检查Bundle是否可能为null,使用getXXXExtra时的默认值。 还有,异步操作如网络请求或数据库查询返回null,没有做空判断就直接使用数据。这时候需要添加空检查,或者使用Optional类来避免。 可能用户没有启用空指针异常检测工具,Android StudioAnalyze菜单中的Infer Nullity功能可以帮助标注可能为null的地方。同时,启用Lint检查也能提前发现问题。 最后,建议用户查看具体的堆栈信息,定位错误发生的行号,检查该行涉及的变量是否可能为null。分步骤调试或打日志来跟踪变量状态。</think>### Android Studiojava.lang.NullPointerException的解决方案 #### 一、问题定位与分析 NullPointerException(NPE)表示尝试在空对象上调用方法或访问字段。根据引用[^1][^2],常见场景包括: 1. **未初始化对象**:如空数组操作`arr[0] = 1`(数组未初始化) 2. **控件未绑定**:如`Button.setOnClickListener()`调用时控件对象为null 3. **数据传递异常**:如通过Intent获取空数据未做判空处理 #### 二、分步解决方案 1. **检查对象初始化** - 数组/集合初始化验证: ```java // 错误示例(引用[^1]) int[] arr = null; arr[0] = 1; // 触发NPE // 正确方式 int[] arr = new int[5]; ``` - 对象创建检查: ```java MyClass obj = new MyClass(); // 必须显式实例化 ``` 2. **控件绑定验证** - 确认布局文件与代码ID一致: ```xml <!-- layout/activity_main.xml --> <Button android:id="@+id/btn_submit" ... /> ``` - 检查`findViewById`调用时机(必须在`setContentView`之后): ```java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 必须优先执行 Button btn = findViewById(R.id.btn_submit); // 正确位置 } ``` 3. **数据传递判空处理** - 使用`getIntent().getExtras()`时添加空保护: ```java Bundle bundle = getIntent().getExtras(); if (bundle != null) { String value = bundle.getString("key", "default"); } ``` 4. **异步操作空值防护** - 网络请求回调示例: ```java api.getData(new Callback() { @Override public void onSuccess(Data data) { if (data != null) { // 必须判空 updateUI(data); } } }); ``` 5. **启用静态检测工具** - 使用Android Studio的`@Nullable`和`@NonNull`注解: ```java public void processData(@NonNull String input) { // 编译器会检查input是否为null } ``` - 通过菜单栏 `Analyze > Infer Nullity` 自动标注可能为null的变量 #### 三、调试技巧 1. **查看完整堆栈轨迹**(如引用[^1]所示): ``` at com.example.MyActivity.onCreate(MyActivity.java:42) // 定位到具体代码行 ``` 2. **使用断点调试**: - 在疑似NPE代码行设置断点 - 观察变量状态(Watch窗口)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值