【问题标题】:NullPointerException issue when calling method inside run method在运行方法中调用方法时出现 NullPointerException 问题
【发布时间】:2014-03-19 02:15:34
【问题描述】:

在运行方法中调用以下方法时,我不断收到空指针异常。

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

这里是日志猫输出

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

    }

}

希望有人能帮我解决这个问题,因为它让我发疯:) 再次感谢

编辑: 这里有更多的代码要求

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



}

以上是我的代码,在run方法中调用了swTimerDisplay

【问题讨论】:

  • timerIsRunning 是布尔值吗?还是布尔值?
  • swCounter 的引用可以是null 吗? StopwatchTimer.java:57 到底是哪一行?
  • endTime 声明在哪里?
  • 第 57 行是哪一行?
  • 如果有的话,使用调试器设置断点和检查变量可能比玩“猜测空变量”游戏更成功。调试器很棒,因为您没有猜测。你可以看到什么是空的,什么不是。

标签: java android nullpointerexception android-handler


【解决方案1】:

我们需要知道“第 57 行”是什么,如果可以请提供调用 swTimerDisplay 的类。没有这个,从这里我只能看到两种可能性,如果你还没有,你应该检查一下。

  1. 您对StopwatchTimer 的引用为空,即尚未实例化, 当您致电swTimerDisplay() 时。实际上你会做null.swTimerDisplay()
  2. swTimerDisplay() 的最后一行,swCounter 为空。

编辑:我刚刚注意到您的方法受到保护,因此我将查看第 2 点。

【讨论】:

  • 第 57 行是 swCounter.setText(display);
  • 我在帖子中添加了额外的细节。再次感谢
  • 好的,我用 if 语句检查了 swCounter,它确实为空。但是我已经使用 findViewById 在 onCreate 方法中设置了 swCounter,所以我知道为什么它为空
  • @user3325917 你能粘贴更多代码吗?例如您的 onCreate,并指出与此相关的调用 swTimerDisplay() 的位置? Runnable 在哪里添加?您可能有竞争条件:en.wikipedia.org/wiki/Race_condition。还要仔细检查您的id 是否正确。
  • 好的,我在帖子的第二次编辑中添加了额外的代码。至于 id 我 100% 肯定它是正确的,因为我使用 setText 来测试它并且它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 2015-09-10
  • 2021-05-28
  • 1970-01-01
相关资源
最近更新 更多