java - 在空对象引用上接收 'android.content.Context android.content.Context.getApplicationContext()'

标签 java android nullpointerexception android-audiomanager

我是 Android 开发和 Java 脚本新手。我正在尝试创建一个应用程序,允许我通过开关打开和关闭内部麦克风。我发现了两个脚本(一个开关脚本和一个麦克风控制脚本),并且我已将它们放在一起,纠正任何调试问题,目前脚本显示干净。但是,当它在手机或模拟器上运行时,它会立即崩溃并显示以下错误,

android.content.Context android.content.Context.getApplicationContext()' on a null object reference"focused around my use of import android.content.Context;.

该错误似乎是由于 Context.getApplicationContext 请求未能找到结果并因此发布 NULL。

我查看了一长串遭受类似领域困扰的其他人,但所有解决方案似乎都集中于对其代码的不同领域的更改,而我无法将这些更改与我自己的脚本联系起来。

package com.example.myfirstapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Switch;

public class MainActivity extends AppCompatActivity {

    private Switch sw1;
    Button btnGet;
    Context context = getApplicationContext();
    AudioManager audioManager = ((AudioManager)context.getSystemService(Context.AUDIO_SERVICE));
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        audioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sw1 = findViewById(R.id.switch1);
        btnGet = findViewById(R.id.getBtn);
        btnGet.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (sw1.isChecked()) {
                    audioManager.setMicrophoneMute(false);
                }
                else {
                    audioManager.setMicrophoneMute(true);
                }

            }
        });
    }
}

即使脚本不起作用,预期的结果是我能够运行该应用程序,目前该应用程序在启动时崩溃并发布以下错误消息...

[Logcat]

2019-08-20 13:23:01.710 5559-5559/com.example.myfirstapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myfirstapp, PID: 5559
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.myfirstapp/com.example.myfirstapp.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
        at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:106)
        at com.example.myfirstapp.MainActivity.<init>(MainActivity.java:16)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2538)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

最佳答案

您的问题是您正在尝试在初始化时检索上下文,即。

Context context = getApplicationContext();

在创建 Activity 之前,不保证 getApplicationContext(); 将返回有效值。在这种情况下,它是空的,当您尝试在下一行访问它时,您会收到空指针异常。您需要在 onCreate() 中与音频管理器一起分配变量 context

例如,像这样:

    Context context;
    AudioManager audioManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getApplicationContext();
        audioManager = ((AudioManager)context.getSystemService(Context.AUDIO_SERVICE));
    ...
    }

另一件事需要注意的是,Activity 类是 Context 的子类,因此您不需要检索您可以编写的应用程序上下文

    AudioManager audioManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        audioManager = ((AudioManager)getSystemService(Context.AUDIO_SERVICE));
    ...
    }

关于java - 在空对象引用上接收 'android.content.Context android.content.Context.getApplicationContext()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57579209/

相关文章:

java - AsyncTaks 的受控执行

java - Java 中搜索方法的空指针异常

java - 还有什么方法可以使 Google map 类中的变量不为空呢?

java - 从对象初始化数组会产生 NullPointerException

java - 主要调用太多类?

java - Java中字节码的目的是什么?

android - PNG 在 Android 中失去透明度(如果它的所有像素都不透明)

java - Spring Boot Maven 项目配置与 MS SQL 数据库 IntegratedSecurity=true

java - HelloWorld servlet 中的 Tomcat 404 classNotFoundException

java - 如果我不导入 android.R 会出现语法错误(如果我导入会出现语法错误)