Проблема NullPointerException при вызове метода внутри метода запуска

Я продолжаю получать исключение нулевого указателя при вызове метода ниже внутри метода запуска.

protected void swTimerDisplay()
{
 String display;
 long now;
 long diff;
 long secs;
 long mins;
 long hours;

 if(timerIsRunning)
 {
     now = System.currentTimeMillis();
 }else{
     now = endTime;
 }

 diff = now - startTime;

 if(diff < 0)
 {
     diff = 0;
 }
 /**
  * Calculate the 
  * secs,mins and hours
  */
 secs = diff / 1000;
 mins = secs  / 60;
 hours = mins / 60;
 secs = secs % 60;
 mins = mins % 60;

 display = String.format("%d", hours) + ":" +
           String.format("%02d", mins) + ":" +
           String.format("%02d", secs);


 swCounter.setText(display);
}

вот вывод журнала cat

02-18 19:47:27.143: E/AndroidRuntime(1695): FATAL EXCEPTION: main
02-18 19:47:27.143: E/AndroidRuntime(1695): Process: com.webdeveloper93.profitnessstopwatch, PID: 1695
02-18 19:47:27.143: E/AndroidRuntime(1695): java.lang.NullPointerException
02-18 19:47:27.143: E/AndroidRuntime(1695):     at com.webdeveloper93.profitnessstopwatch.StopwatchTimer.swTimerDisplay(StopwatchTimer.java:57)
02-18 19:47:27.143: E/AndroidRuntime(1695):     at com.webdeveloper93.profitnessstopwatch.timerUpdate.run(timerUpdate.java:22)
02-18 19:47:27.143: E/AndroidRuntime(1695):     at android.os.Handler.handleCallback(Handler.java:733)
02-18 19:47:27.143: E/AndroidRuntime(1695):     at android.os.Handler.dispatchMessage(Handler.java:95)
02-18 19:47:27.143: E/AndroidRuntime(1695):     at android.os.Looper.loop(Looper.java:137)
02-18 19:47:27.143: E/AndroidRuntime(1695):     at android.app.ActivityThread.main(ActivityThread.java:4998)
02-18 19:47:27.143: E/AndroidRuntime(1695):     at java.lang.reflect.Method.invokeNative(Native Method)
02-18 19:47:27.143: E/AndroidRuntime(1695):     at java.lang.reflect.Method.invoke(Method.java:515)
02-18 19:47:27.143: E/AndroidRuntime(1695):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)

Спасибо за любую помощь, которую вы можете предоставить.

ИЗМЕНИТЬ:

Строка 57: swCounter.setText(display);

ниже показано, где swTimerDisplay(); называется

public class timerUpdate extends StopwatchTimer  implements Runnable {

    @Override
    public void run() {
        swTimerDisplay();
        if(handle != null)
        {
            handle.postDelayed(this, UPDATE);
        }

    }

}

надеюсь, кто-то может помочь мне понять это, потому что это сводит меня с ума :) еще раз спасибо

EDIT: Вот дополнительный код по запросу

public class Stopwatch extends Activity implements OnClickListener {

    private StopwatchTimer timer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stopwatch);
        //Create new instance of StopwatchTimer
        timer = new StopwatchTimer();
        timer.swCounter = (TextView) findViewById(R.id.swcounter);
        timer.start = (Button) findViewById(R.id.start);
        timer.stop =  (Button) findViewById(R.id.stop);
        timer.start.setOnClickListener(this);
        timer.stop.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        if(v==timer.start)
        {
            timer.timerStart();
        }else if(v==timer.stop)
        {
            timer.timerStop();
        }

    }

    public final Runnable timerUpdate = new Runnable(){
        public void run(){
            try {
                timer.swTimerDisplay();
                if(timer.handle != null)
                {
                timer.handle.postDelayed(this, StopwatchTimer.UPDATE); 
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }   
        }
    };



}

выше мой код, и swTimerDisplay вызывается в методе запуска


person user3325917    schedule 19.02.2014    source источник
comment
timerIsRunning является логическим? или булева?   -  person VinayVeluri    schedule 19.02.2014
comment
Может ли ссылка на swCounter быть null? Какая строка StopwatchTimer.java:57 вообще?   -  person MadProgrammer    schedule 19.02.2014
comment
Где объявлено endTime?   -  person Kevin Bowersox    schedule 19.02.2014
comment
какая строка 57?   -  person Jacob Schoen    schedule 19.02.2014
comment
я думаю, что startTime равно null   -  person DigCamara    schedule 19.02.2014
comment
Во всяком случае, вы, вероятно, добьетесь большего успеха, используя отладчик, устанавливающий точку останова и проверяя переменные, чем играя в игру с угадыванием нулевой переменной. Отладчик великолепен, так как вы не угадываете. Вы можете видеть, что является нулевым, а что нет.   -  person Josh Bowden    schedule 19.02.2014
comment
@KevinBowersox endTime может быть только примитивным (скорее всего, длинным). @DigCamara Плохо просто догадываться, вы можете сделать вывод из кода OP, что startTime является примитивом (вероятно, длинным).   -  person SK9    schedule 19.02.2014


Ответы (1)


Нам нужно знать, что такое «строка 57», если вы можете указать класс, в котором вызывается swTimerDisplay. Без этого отсюда я вижу только две возможности, которые вам следует проверить, если вы еще этого не сделали.

  1. Ваша ссылка на StopwatchTimer имеет значение null, т. е. не была создана, когда вы вызываете swTimerDisplay(). По сути, вы будете делать null.swTimerDisplay().
  2. В последней строке swTimerDisplay() swCounter равно нулю.

Изменить: я только что заметил, что ваш метод защищен, поэтому я бы посмотрел на пункт 2.

person SK9    schedule 19.02.2014
comment
Строка 57: swCounter.setText(display); - person user3325917; 19.02.2014
comment
Я добавил дополнительные детали в свой пост. Спасибо еще раз - person user3325917; 19.02.2014
comment
Хорошо, я проверил swCounter с помощью оператора if, и он действительно равен нулю. Но я установил swCounter в методе onCreate, используя findViewById, поэтому не понимаю, почему его значение null - person user3325917; 19.02.2014
comment
@user3325917 user3325917 Можете ли вы вставить больше кода? Например, ваш onCreate, и укажите, где вызывается swTimerDisplay() в связи с этим? А куда добавляется Runnable? У вас может быть условие гонки: en.wikipedia.org/wiki/Race_condition. Также дважды проверьте правильность вашего id. - person SK9; 19.02.2014
comment
Хорошо, я добавил дополнительный код во втором редактировании моего поста. Что касается идентификатора, я на 100% уверен, что он правильный, потому что я использовал setText, чтобы просто проверить его, и это сработало. - person user3325917; 19.02.2014
comment
@ user3325917 Спасибо. Куда вы публикуете Runnable timerUpdate? (Возможно, вы где-то делаете .runOnUiThread() вызов.) - person SK9; 19.02.2014
comment
Вот здесь handle = new Handler(); обновление = новый секундомер(); handle.postDelayed(update.timerUpdate, UPDATE); внутри метода под названием timerStart - person user3325917; 19.02.2014
comment
Хорошо, я знаю проблему, но не знаю, как ее исправить. По какой-то причине любой метод или свойство, которое я вызываю внутри метода запуска, хочет создать исключение nullpointer. Даже если я создаю новый экземпляр обработчика в методе onCreate, когда я проверяю, является ли его нуль внутри метода запуска, он действительно равен нулю. Не знаю, почему это происходит, есть идеи? - person user3325917; 19.02.2014
comment
Я все переписал, и теперь все работает, еще раз спасибо за помощь :) - person user3325917; 20.02.2014