Борьба с исключением NullPointerException - PullRequest
1 голос
/ 15 июня 2011

Всего начинающий программист пытается создать свое первое приложение для Android.Простой таймер обратного отсчета и несколько других вещей, и все это работало, но для того, чтобы попытаться устранить проблему с таймером обратного отсчета, я переместил этот фрагмент кода из кнопки «Пуск» в «Клик» в onCreate действия (или, по крайней мере,Я думаю у меня есть).Я думаю, это означает, что таймер обратного отсчета готов к работе, но на самом деле он не запустится, пока пользователь не нажмет кнопку «Пуск».

В любом случае, с кодом ниже я получаю исключение NullPointerException, когдазагружается активность, и я не уверен, где, или если что-то, что я сделал, это дистанционно хорошее программирование (я недавно смотрел много видео на YouTube и получил много помощи от других вопросов здесь).

Любойпомощь будет очень хорошо принята:)

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);
    }
}
}

Ответы [ 4 ]

1 голос
/ 15 июня 2011

Подумайте о том, чтобы сделать ваши элементы пользовательского интерфейса (например, txt_cp_value) переменными-членами класса, а затем назначить их в методе onCreate.Таким образом, они будут доступны из анонимного OnClickListener.Из того, что я вижу, txt_cp_value.setText("" + String.valueOf(myCommandPoints)); может быть виновником.

Есть ли у вас трассировка стека?

1 голос
/ 15 июня 2011

Исключение нулевого указателя в строке типа

A.B.C.D

означает, что либо

  • А является нулевым
  • или A.B равно нулю
  • или A.B.C равно нулю

Что-то слева от точки равно нулю.

Поэтому предоставьте промежуточные переменные и напечатайте их в консоли, чтобы определить, какое значение равно нулю.

С уважением, Stéphane

0 голосов
/ 16 июня 2011

Исправлено

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

Был виновный код. Переместил его внутрь кнопки на клике слушателя. Это всего лишь временный код для проверки чего-либо.

Еще раз спасибо за помощь, ребята. Теперь я знаю больше о Java и трассировке стека, чем вчера:)

0 голосов
/ 15 июня 2011

"Простой таймер обратного отсчета и некоторые другие вещи, и все это работало, но для того, чтобы попытаться исправить проблему с таймером обратного отсчета, я переместил этот фрагмент кода из кнопки« Пуск »в« Клик »в onCreate действия «

Если это так, то, скорее всего, код, который вы переместили в метод onCreate, пытается использовать что-то, что не инициализировано в методе onCreate, но было инициализировано в методе onClick кнопки запуска. Ищите что-то подобное в своем коде.

О коде. Это далеко не эффективно:

if (oneMinuteRemaining == 60){
    oneminrem.start();
}
if (oneMinuteRemaining == 30){
    oneminrem.start();
}

Вы должны использовать «else if» после первого «if» вместо.

...