簡體   English   中英

在空對象引用上接收“ android.content.Context android.content.Context.getApplicationContext()”

[英]Receiving 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference

我是Android開發和使用Java編寫腳本的新手。 我正在嘗試創建一個應用程序,該應用程序允許我通過開關打開和關閉內部麥克風。 我找到了兩個腳本(一個切換腳本和一個麥克風控制腳本),並且將它們放在一起,在我進行調試時糾正了所有調試問題,當前該腳本顯示為干凈。 但是,當它在手機或模擬器上運行時,它立即崩潰並發布以下錯誤,

android.content.Context android.content.Context.getApplicationContext()在“空對象引用”上針對我對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();

不能保證getApplicationContext(); 將返回有效值,直到創建活動為止。 在這種情況下,它為null,當您嘗試在下一行訪問它時,將獲得null指針異常。 您需要在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));
    ...
    }

我想,這里的問題是這一行:

Context context = getApplicationContext();

不用將其初始化為類字段,而是在onCreate()方法中對其進行初始化。 例如:

public class MainActivity extends AppCompatActivity {

private Switch sw1;
Button btnGet;
Context context;
AudioManager audioManager;
@Override
protected 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);
    .
    .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM