java - 与 NullPointerException 作斗争

标签 java android timer nullpointerexception countdown

这里的新手程序员正在尝试制作他的第一个 Android 应用程序。一个简单的倒数计时器和其他一些东西,一切正常,但为了尝试解决倒数计时器的问题,我将该部分代码从 Start Button onClick 移动到 Activity 的 onCreate(或至少我想我有)。在我看来,我认为这意味着倒数计时器已准备好运行,但在用户按下“开始”按钮之前不会真正运行。

无论如何,使用下面的代码,当 Activity 加载时我得到一个 NullPointerException,我不确定在哪里,或者我所做的任何事情是否是远程良好的编程(我最近看了很多 YouTube vids 并且得到了这里的其他问题提供了很多帮助)。

任何帮助都会很受欢迎:)

package com.asurya.hulktimer;

import java.util.Random;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Vibrator;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class main extends Activity {

    long starttime = 180000;
    long count = 1000;
    long timechange = 30000;
int missionpoints = 0;
boolean isPaused = false;
boolean clockrunning = false;

Context context = getApplicationContext();
CharSequence text = "Clock is running - create some pause code";
int duration = Toast.LENGTH_LONG;




/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(com.asurya.hulktimer.R.layout.main);


 // THIS SECTION ENABLES THE FEEDBACK FOR ALL THE BUTTONS

    final Vibrator vibe = (Vibrator) this.getSystemService(VIBRATOR_SERVICE);

 // THIS SECTION DEFINES THE FONT FOR ALL THE OBJECTS IN THE VIEW       

   final Button but_start = (Button) findViewById(com.asurya.hulktimer.R.id.but_start);
   Typeface font = Typeface.createFromAsset(getAssets(), "CASLANTR.TTF");
   but_start.setTypeface(font);

   final Button but_reset = (Button) findViewById(com.asurya.hulktimer.R.id.but_reset);
   but_reset.setTypeface(font);

   final TextView txt = (TextView) findViewById(com.asurya.hulktimer.R.id.timer);
   txt.setText(formatTime(starttime));
   txt.setTypeface(font);

   final TextView txt_mt_1 = (TextView)      findViewById(com.asurya.hulktimer.R.id.lbl_missiontally_1);
   txt_mt_1.setTypeface(font);

   final TextView txt_mt_2 = (TextView) findViewById(com.asurya.hulktimer.R.id.lbl_missiontally_2);
   txt_mt_2.setTypeface(font);

   final TextView txt_mt_value = (TextView) findViewById(com.asurya.hulktimer.R.id.lbl_mt_value);
   txt_mt_value.setTypeface(font);

   final TextView txt_cp_value = (TextView) findViewById(com.asurya.hulktimer.R.id.lbl_cp_value);
   txt_cp_value.setTypeface(font);

   final Button but_add_time = (Button) findViewById(com.asurya.hulktimer.R.id.but_add);
   but_add_time.setTypeface(font);

   final Button but_minus_time = (Button) findViewById(com.asurya.hulktimer.R.id.but_minus);
   but_minus_time.setTypeface(font);

   final Button but_generate_cp = (Button) findViewById(com.asurya.hulktimer.R.id.but_generate_cp);
   but_generate_cp.setTypeface(font);

   final Button but_mp_add = (Button) findViewById(R.id.but_mp_add);
   but_mp_add.setTypeface(font);

   final Button but_mp_minus = (Button) findViewById(com.asurya.hulktimer.R.id.but_mp_minus);
   but_mp_minus.setTypeface(font);

   final Button but_mp_reset = (Button) findViewById(com.asurya.hulktimer.R.id.but_mp_reset);
   but_mp_reset.setTypeface(font);

   {

       //  THIS SECTION IS THE COMMAND POINTS CODE

       final MediaPlayer mp = MediaPlayer.create(this, R.raw.generate);

       Button but_generate_cp1 = (Button) findViewById(com.asurya.hulktimer.R.id.but_generate_cp);
       but_generate_cp1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            vibe.vibrate(50);
            mp.start();

            final Random random = new Random();
            int mycps  = random.nextInt(6);
            final int myCommandPoints = mycps + 1;

            txt_cp_value.setText("" + String.valueOf(myCommandPoints));
        }
    });
   }

   // THIS SECTION IS THE COUNTDOWN TIMER

   final MediaPlayer oneminrem = MediaPlayer.create(this, R.raw.ping);

   final CountDownTimer gameclock = new CountDownTimer(starttime, count) {

    @Override
    public void onTick(long millisUntilFinished) {
        // TODO Auto-generated method stub

        txt.setText("" + formatTime(millisUntilFinished));

        long oneMinuteRemaining = millisUntilFinished /1000;

        if (oneMinuteRemaining == 60){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 30){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 15){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 10){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 9){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 8){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 7){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 6){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 5){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 4){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 3){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 2){
            oneminrem.start();
        }
        if (oneMinuteRemaining == 1){
            oneminrem.start();
        }


    }

    @Override
    public void onFinish() {
        // TODO Auto-generated method stub
        txt.setText("00:00");
        but_start.setText("Start");
        clockrunning = false;
    }
};

// THIS SECTION IS THE TIMER BUTTONS

    Button but_start1 = (Button) findViewById(R.id.but_start);
    but_start1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

        vibe.vibrate(50);

        if (clockrunning = false) {
            gameclock.start();
        }

        if (clockrunning = true) {

            // Display a Toast message to confirm code working.
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }

        }
    });




       Button but_reset1 = (Button) findViewById(R.id.but_reset);
   but_reset1.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        vibe.vibrate(50);
        if (clockrunning == true){

        }
    }
});



   //THIS SECTIONS IS THE BUTTONS WHICH ADD OR SUBTRACT TIME FROM THE STARTING TIME

   Button but_add1 = (Button) findViewById(R.id.but_add);
   but_add1.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        vibe.vibrate(50);
        if (clockrunning == false) {
        starttime = starttime + timechange;
        txt.setText(formatTime(starttime));
        }

    }
});

   Button but_minus1 = (Button) findViewById(R.id.but_minus);
   but_minus1.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        vibe.vibrate(50);
        if (clockrunning == false) {
        starttime = starttime - timechange;
        txt.setText(formatTime(starttime));
        }

    }
});


   //THIS SECTION HANDLES THE MISSIONS POINTS CODE

   txt_mt_value.setText("" + String.valueOf(missionpoints));

   Button but_missionpoint_add = (Button) findViewById(R.id.but_mp_add);
   but_missionpoint_add.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        vibe.vibrate(50);
        missionpoints = missionpoints + 1;
        txt_mt_value.setText("" + String.valueOf(missionpoints));

    }
});

   Button but_missionpoint_minus = (Button) findViewById(R.id.but_mp_minus);
   but_missionpoint_minus.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        vibe.vibrate(50);
        missionpoints = missionpoints - 1;
        txt_mt_value.setText("" + String.valueOf(missionpoints));
    }
});

   Button but_missionpoints_reset = (Button) findViewById(R.id.but_mp_reset);
   but_missionpoints_reset.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        vibe.vibrate(50);
        missionpoints = 0;
        txt_mt_value.setText("" + String.valueOf(missionpoints));
    }
});
}

    /* (non-Javadoc)
 * @see android.app.Activity#finish()
 */
@Override
public void finish() {
    // TODO Auto-generated method stub
    super.finish();
}

public String formatTime(long millis) {
 //   String output = "00:00";
    long seconds = millis / 1000;
    long minutes = seconds / 60;

    seconds = seconds % 60;
    minutes = minutes % 60;

    String secondsD = String.valueOf(seconds);
    String minutesD = String.valueOf(minutes);

    if (seconds < 10)
      secondsD = "0" + seconds;
    if (minutes < 10)
      minutesD = "0" + minutes;

    String output = minutesD + " : " + secondsD;
    return output;
  }  

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case R.id.Info:
    Intent myInfoMenuIntent = new Intent(main.this, Info.class);
    startActivity(myInfoMenuIntent);
        return true;
    case R.id.Credits:
        Intent myCreditMenuIntent = new Intent(main.this, Credits.class);
        startActivity(myCreditMenuIntent);
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}
}

最佳答案

考虑让您的 UI 元素(例如 txt_cp_value)成为该类的成员变量,然后在 onCreate 方法中分配它们。这样就可以从匿名的 OnClickListener 访问它们。据我所知,txt_cp_value.setText(""+ String.valueOf(myCommandPoints)); 可能是罪魁祸首。

你有堆栈跟踪吗?

关于java - 与 NullPointerException 作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6361559/

相关文章:

c - 如何创建一个从 99% 倒计时到 0% 每秒减少 1% 的计时器

javascript - 无法调整 Javascript 报价旋转器第一个报价的初始报价加载时间

java - 无法使用 19.3 JDBC 驱动程序连接到 Oracle 19.3

java - 如何将可变对象编排为跨对象的不可变对象(immutable对象)

java - 如何以编程方式在收件箱中添加短信并在 android 中发送消息?

c - 在Windows上安装定时器/时钟ISR - 单线程环境中的异步调用

java - 使用嵌套循环创建交替瓷砖地板

java - 从 Java 自动生成 Swagger 文档

android - 等待 AsyncTask 在 'PROCEEDING' 之前完成

android ACTION_VIDEO_CAPTURE 不保存视频