猿问

在空对象引用上接收“android.content.Context android.content.

我是 android 开发和使用 java 编写脚本的新手。我正在尝试创建一个应用程序,允许我通过开关打开和关闭内部麦克风。我找到了两个脚本(一个开关脚本和一个麦克风控制脚本),我已经将它们放在一起,在我进行的过程中纠正了所有调试问题,目前脚本显示得很干净。但是,当它在手机或模拟器上运行时,它会立即崩溃并显示以下错误,

android.content.Context android.content.Context.getApplicationContext()' on a null object reference”重点围绕我对 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);

                }


            }

        });

    }

}

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


holdtom
浏览 215回答 2
2回答

杨__羊羊

您的问题是您试图在初始化时检索上下文,即。Context context = getApplicationContext();在创建活动之前,无法保证getApplicationContext();会返回有效值。在这种情况下,它是空的,当你试图在下一行访问它时,你会得到一个空指针异常。您需要context在onCreate()音频管理器中分配变量。例如,像这样:    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));    ...    }

ibeautiful

我想,这里的问题是这一行:Context context = getApplicationContext();不要将其初始化为类字段,而是在onCreate()方法内部对其进行初始化。例如:public class MainActivity extends AppCompatActivity {private Switch sw1;Button btnGet;Context context;AudioManager audioManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    audioManager = ((AudioManager)getSystemService(Context.AUDIO_SERVICE));    audioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);    context = getApplicationContext();    setContentView(R.layout.activity_main);    sw1 = findViewById(R.id.switch1);    btnGet = findViewById(R.id.getBtn);    .    .
随时随地看视频慕课网APP

相关分类

Java
我要回答