【问题标题】:E/AndroidRuntime: FATAL EXCEPTION: mainE/AndroidRuntime: 致命异常: main
【发布时间】:2022-10-25 04:29:09
【问题描述】:

下面的这个错误出现在我的 CountDown 应用程序上,我的所有代码都是正确的,因为我正在关注 youtube 教程。我尝试更新我的 Gradle 并检查了网络上的编译器问题。我该如何解决这个问题?

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.countdowntimerapp, PID: 28507 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference at com.example.countdowntimerapp.MainActivity$1.onClick(MainActivity.java:33) at android.view.View.performClick(View.java:7506) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194) at android.view.View.performClickInternal(View.java:7483) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:29335) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7898) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

这是主要活动的代码。已尝试进行调试,并且已对大部分代码进行了注释以检查问题所在。

   public class MainActivity extends AppCompatActivity {
   private static final long START_TIME_IN_MILLIS = 600000;
     private TextView mTextViewCountdown;
     private Button mButtonStartPause;
     private Button mButtonReset;
     private CountDownTimer mCountdownTimer;
     private Boolean mTimerRunning;
     private long mTimeLeftInMills = START_TIME_IN_MILLIS ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextViewCountdown = findViewById(R.id.text_view_countdown);
        mButtonStartPause = findViewById(R.id.btn_start_pause);
        mButtonReset = findViewById(R.id.btn_reset);

        mButtonStartPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mTimerRunning){
                    pauseTimer();
                }
                else {
                    startTimer();
                }
            }
        });
        mButtonReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                resetTimer();
            }
        });
        updateCountdownText();
    }
    private void startTimer() {
        mCountdownTimer = new CountDownTimer(mTimeLeftInMills, 1000) {
            @Override
            public void onTick(long millsLeftUntilFinished) {
                mTimeLeftInMills = millsLeftUntilFinished;
                updateCountdownText();
            }


            @Override
            public void onFinish() {
              mTimerRunning = false;
              mButtonStartPause.setText("Start");
              mButtonReset.setVisibility(View.INVISIBLE);
            }
        }.start();
        mTimerRunning = true;
        mButtonStartPause.setText("pause");
        mButtonReset.setVisibility(View.INVISIBLE);
    }
    private void pauseTimer() {
        mCountdownTimer.cancel();
        mTimerRunning = false;
        mButtonStartPause.setText("Start");
        mButtonReset.setVisibility(View.VISIBLE);
    }
    private void resetTimer() {
        mTimeLeftInMills = START_TIME_IN_MILLIS;
        updateCountdownText();
        mButtonReset.setVisibility(View.INVISIBLE);
        mButtonStartPause.setVisibility(View.VISIBLE);
    }
    private void updateCountdownText() {
        int minutes = (int) (mTimeLeftInMills / 1000) / 60;
        int seconds = (int) (mTimeLeftInMills / 1000) % 60;

        String timeLeftFormatted = String.format(Locale.getDefault(),"%02d:%02d", minutes, seconds);
        mTextViewCountdown.setText(timeLeftFormatted);
    }

}```

【问题讨论】:

    标签: java android firebase


    【解决方案1】:

    创建变量有两个步骤:

    1. 声明 - 为变量命名和类型(int、String 等...)

    2. 初始化 - 给变量一个值(int 的数字,布尔值的 true/false 等)

      您的代码声明了一个变量:

      private Boolean mTimerRunning;
      

      但仅在 startTimer() 函数中首先对其进行初始化:

       private void startTimer() {
          mCountdownTimer = new CountDownTimer(mTimeLeftInMills, 1000) {
              @Override
              public void onTick(long millsLeftUntilFinished) {
                  mTimeLeftInMills = millsLeftUntilFinished;
                  updateCountdownText();
              }
      
      
              @Override
              public void onFinish() {
                mTimerRunning = false;
                mButtonStartPause.setText("Start");
                mButtonReset.setVisibility(View.INVISIBLE);
              }
          }.start();
          
          //here
          mTimerRunning = true;
      
          mButtonStartPause.setText("pause");
          mButtonReset.setVisibility(View.INVISIBLE);
      }
      

      当您第一次触摸 mButtonStartPause 按钮​​启动计时器时,您的代码应该调用 startTimer() 函数。 为此,您检查 mTimerRunning 的值,但那里没有任何价值.该值将仅在 startTimer() 中设置。

      在尝试使用它之前,您需要为 mTimerRunning 变量赋值。 发生错误是因为您尝试使用不存在的东西。

      通过在声明它时给 mTimerRunning 一个值 (false) 来修复它:

      ...
      private CountDownTimer mCountdownTimer;
      
      //fix
      private Boolean mTimerRunning = false;
      
      private long mTimeLeftInMills = START_TIME_IN_MILLIS ;
      ...
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 2019-03-18
      相关资源
      最近更新 更多