为了账号安全,请及时绑定邮箱和手机立即绑定

为什么对象在 RestoreInstanceState 上抛出 nullPointe

为什么对象在 RestoreInstanceState 上抛出 nullPointe

LEATH 2023-07-19 10:09:18
我的 android 应用程序中有一个 TextView 和 ImageButton 对象,它们在应用程序启动(onCreate)时正确显示,但是当调用 saveInstanceState() 和 RestoreInstanceState() 时,编译器会抛出 nullPointerException (即使它们的状态已正确加载)我尝试设置文本或任何与此相关的内容。我还有一些其他 ImageButtons 两次都正确显示(在第一次 onCreate 时,以及在调用 RestoreInstanceState 时),所以它让我更加困惑。我曾尝试创建 TextView 的另一个实例,为其设置 Text,然后将该 TextView 设置为原始实例,但它不起作用。public class MainActivity extends AppCompatActivity {    private TextView score;    private TextView labelPoints;    private ImageButton finQuest;    private int langFlag = 0;    private PowerManager.WakeLock wakeLock;    private int points = 0;    private ListenerQuestionChooser lqc;    //saving and loading the instanceState of the buttons bellow works perfectly    private ImageButton btn1;    private ImageButton btn2;    private ImageButton btn3;    private ImageButton btn4;    private ImageButton btn5;    private ImageButton btn6;    @SuppressLint("InvalidWakeLockTag")    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);        wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");        wakeLock.acquire();        setContentView(R.layout.activity_main);        labelPoints = findViewById(R.id.total_score);        finQuest = findViewById(R.id.btn_finanswer);        score = findViewById(R.id.text_points);         btn1 = findViewById(R.id.btn1);        btn2 = findViewById(R.id.btn2);        btn3 = findViewById(R.id.btn3);        btn4 = findViewById(R.id.btn4);        btn5 = findViewById(R.id.btn5);        btn6 = findViewById(R.id.btn6);        }最终编辑:经过大约 16 个小时的头撞墙、尝试各种事情(逻辑和不逻辑的)并在每一步上打印日志,我解决了这个问题。所以这就是解决方案(我仍然不明白为什么其他对象在没有这个的情况下可以完美工作,而这些对象需要它,但是嘿,只要它有效,我就会接受它)。
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

经过大约 16 个小时的头撞墙、尝试各种事情(逻辑和不逻辑的)并在每一步打印日志之后,我解决了这个问题。所以这就是解决方案(我仍然不明白为什么其他对象在没有这个的情况下可以完美工作,而这些对象需要它,但是嘿,只要它有效,我就会接受它)。


if (lqc == null) {

    lqc = new ListenerQuestionChooser(this, this);

}


if (savedInstanceState != null) {

    this.loadSettings(savedInstanceState);

}


if (finQuest == null) {

    try {

        finQuest = findViewById(R.id.btn_finansfer);

        finQuest.setOnClickListener(lqc);

        if (ListenerQuestionChooser.getCorrectAnswer() > 0) {

            finQuest.setVisibility(View.VISIBLE);

        } else {

            finQuest.setVisibility(View.INVISIBLE);

        }

    } catch (Exception e) {

        e.printStackTrace();

    }

}


if (labelPoints == null) {

    labelPoints = findViewById(R.id.total_score);

    score = findViewById(R.id.text_points);

    try {

        ss = new StringSetter(this);

        if (getLangFlag() == 0) {

            labelPoints.setVisibility(View.INVISIBLE);

            score.setVisibility(View.INVISIBLE);

        } else {

            score.setText(String.valueOf(getPoints()));

            labelPoints.setText(ss.podesiPromenljivu(brPoena, getLanguage()));

        }

    } catch (Exception e) {

        e.printStackTrace();

    }

}


查看完整回答
反对 回复 2023-07-19
?
侃侃无极

TA贡献2051条经验 获得超10个赞

这显然不是完整的来源,所以我们只能猜测。看起来您第一次创建此活动时 langFlag 设置为 0。从捆绑包中读取它后,它必须是一个不同的值,因为您进入了 else 块。我们不知道 getPoints 是什么 - 它只在您获得 NPE 的地方提到一次。因此,看起来 getPoints 为 null,但我们无法从您附加的代码中看出原因。



查看完整回答
反对 回复 2023-07-19
  • 2 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信