- java.lang.NullPointerException - null对象引用上的setText

时间:2015-01-12 21:30:26

标签: java android nullpointerexception

这就是我想要做几个小时的事情: 我有一个MainActivity.java文件(在下面列出)和一个带有开始按钮的fragment_start.xml文件。点击开始按钮应显示带有points- / round-和countdown-Textviews的activity_main.xml文件。它不起作用,这就是正在发生的事情:

logcat告诉我: PID:1240 java.lang.NullPointerException:尝试调用虚方法' void android.widget.TextView.setText(java.lang.CharSequence)'在空对象引用上

模拟器显示:很遗憾,GAME已停止。

有必要提一下我在编程方面比较新吗?

感谢您的任何建议!

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


public class MainActivity extends Activity implements View.OnClickListener {

private int points;
private int round;
private int countdown;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    showStartFragment();
}

private void newGame () {
    points=0;
    round=1;
    initRound();
}

private void initRound() {
    countdown = 10;
    update();
}

private void update () {
    fillTextView(R.id.points, Integer.toString(points));
    fillTextView(R.id.round, Integer.toString(round));
    fillTextView(R.id.countdown, Integer.toString(countdown * 1000));
}

private void fillTextView (int id, String text) {
    TextView tv = (TextView) findViewById(id);
    tv.setText(text);
}

private void showStartFragment() {
    ViewGroup container = (ViewGroup) findViewById(R.id.container);
    container.removeAllViews();
    container.addView(
            getLayoutInflater().inflate(R.layout.fragment_start, null) );
    container.findViewById(R.id.start).setOnClickListener(this);
}

@Override
public void onClick(View view) {
    if(view.getId() == R.id.start) {
        startGame();
    }
}

public void startGame() {
    newGame();
}
}

3 个答案:

答案 0 :(得分:25)

问题是tv.setText(text)。变量tv可能是null,您可以在setText上调用null方法,但您不能。 我猜这个问题出在findViewById方法上,但它不在这里,所以如果没有代码,我就说不出更多。

答案 1 :(得分:19)

这就是你的问题:

private void fillTextView (int id, String text) {
    TextView tv = (TextView) findViewById(id);
    tv.setText(text); // tv is null
}

- > (TextView)findViewById(id); //返回null 但是从你的代码中,我找不到为什么这个方法返回null。试着追查, 你给出的id作为参数,以及是否存在具有指定id的视图。

错误信息非常清晰,甚至可以告诉您什么方法。 来自文档:

public final View findViewById (int id)
    Look for a child view with the given id. If this view has the given id, return this view.
    Parameters
        id  The id to search for.
    Returns
        The view that has the given id in the hierarchy or null

http://developer.android.com/reference/android/view/View.html#findViewById%28int%29

换句话说:您没有使用您作为参数提供的ID的视图。

答案 2 :(得分:4)

private void fillTextView (int id, String text) {
    TextView tv = (TextView) findViewById(id);
    tv.setText(text);
}

如果您正在获取空指针异常,则找不到您传入findViewById()的id的视图,并且当您尝试调用函数时抛出实际异常{在setText()上{1}}。您应该发布null的XML,因为只需查看代码就很难分辨出问题所在。

更多关于空指针的阅读:What is a NullPointerException, and how do I fix it?