【问题标题】:null pointer exception at getRingerMode()getRingerMode() 处的空指针异常
【发布时间】:2017-09-20 10:24:27
【问题描述】:

我编写了这个应用程序,用户可以通过单击图像按钮来切换静音模式: 包装 p.a;

import android.media.AudioManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    AudioManager audioManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView imageView = (ImageView) findViewById(R.id.imageView);
        final AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        View.OnClickListener onClickListener = new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                mode.toggle(audioManager);
                update();
            }
        };
        imageView.setOnClickListener(onClickListener);
    }

    public void update(){
        int mod=mode.phonesilent(audioManager)?
                R.drawable.ringer_off:
                R.drawable.ringer_on;
        }
    }

这是模式类:

package p.a;

import android.media.AudioManager;

/**
 * Created by root on 9/19/17.
 */

public class mode {
    public static boolean phonesilent(AudioManager audioManager){
        return audioManager.getRingerMode()==AudioManager.RINGER_MODE_SILENT;
    }

    public static void toggle(AudioManager audioManager){
        int mode = phonesilent(audioManager)?
                AudioManager.RINGER_MODE_NORMAL:
                AudioManager.RINGER_MODE_SILENT;
    }
}

该应用程序可以正常初始化,但是当我单击图像图标时,它会崩溃并在标题中产生错误消息。 这是日志:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.media.AudioManager.getRingerMode()' on a null object reference
                                                         at p.a.mode.phonesilent(mode.java:11)
                                                         at p.a.MainActivity.update(MainActivity.java:29)
                                                         at p.a.MainActivity$1.onClick(MainActivity.java:22)

【问题讨论】:

  • 只需将final AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 更改为audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);,因为您已经在声明部分声明了AudioManager audioManager;

标签: java android android-studio debugging


【解决方案1】:

首先像这样创建一个模式对象:

Mode mode = new Mode();

【讨论】:

  • 但是模式类中的所有方法都是静态的,所以你不需要创建它的实例来调用它们。
  • 类有静态方法,不需要创建实例。
  • 你知道是什么导致了这个问题的出现吗?
  • @Piyush 我在这里更深入。为什么前面加上类型修饰符会出现这个错误?当然我已经在 oncreate 方法之前声明了它,但是为什么添加它的类型会导致这个特殊问题呢?
  • @pxc3110 好的,你想知道什么?
【解决方案2】:

您可以按照 Vamshi Krishna 所说的那样进行操作,这完全是解决这个问题的好方法,但是如果您由于某种原因不想实例化它,您可以将“模式类”更改为“模式静态类”,如下所示:

package p.a;

import android.media.AudioManager;

/**
 * Created by root on 9/19/17.
 */

public static class mode {
    public static boolean phonesilent(AudioManager audioManager){
        return audioManager.getRingerMode()==AudioManager.RINGER_MODE_SILENT;
    }
    public static void toggle(AudioManager audioManager){
        int mode = phonesilent(audioManager)?
                AudioManager.RINGER_MODE_NORMAL:
                AudioManager.RINGER_MODE_SILENT;
    }
}

希望对你有帮助!

【讨论】:

  • 不过不需要换班。因为错误与此无关。
  • @Óscar García Sáez 它说“此处不允许使用静态修饰符”,这是为什么呢?
  • @pxc3110 但是你为什么要深入?我已经评论过了。检查。它将解决您的问题。
  • 抱歉,我正在回复 Óscar García Sáez 的回答
  • 是的。但这不是你的解决方案@pxc3110
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
相关资源
最近更新 更多