setText方法报空指针异常

今天做开发的时候发现一个TextView的setText方法报空指针异常。当时就想着是不是TextView没有初始化,却发现它不为null。然后,就想着既然它不是空的,那就有可能是我传入的值是空的咯!令人沮丧的是我发现传入的值也不为空!!!究其原因,最后发现因为传入的是ArrayList.size()方法,即传入的值类型不对!

textView.setText(list.size());

这里传入的是一个int类型,而一般情况下应该是CharSequence类型。当然,你可能会想卧槽,你也它新手了把。不过我想记录的不是类型搞错的问题,而是为什么会在这上面犯错的原因。

原因:首先,我们一般情况下setText()方法传入的是CharSequence类型(String类型是它的一个子类)。那么, 你有没有考虑为什么它也可以传入int类型呢?而且编译时不报错!!!(报错的话,我们不就可以一眼看穿了吗!)其原因是setText( )的重载方法中还真有一个参数类型是int类型的(纳尼,怎么会这样)。那既然有int类型的重载方法,为什么还报错呢?下面是这个方法的源码,大家看一下应该会恍然大悟。

public final void setText(int resid) {
        throw new RuntimeException("Stub!");
    }

在上面的代码中,从int类型的参数名你就可以猜到,它代表的是资源的id也就是常说的R文件里面的东西。所以它也会指向一个CharSequence类型,而不是一个int类型或者其他的非CharSequence类型或者其子类。

所以,综上所述,大家还是不要像我一样犯低级错误就好了。哈哈

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,UI 只能在主线程(也称为 UI 线程)中更新。如果你在另一个线程中更新 UI,就会出现空指针异常或其他异常。这是因为 Android 系统保护了 UI 线程,不允许在其他线程中直接更新 UI。为了解决这个问题,Android 提供了一种机制,即 Handler。 Handler 是 Android 中的一个类,它的主要作用是将消息发送到主线程的消息队列中,然后在主线程中处理这些消息。通过使用 Handler,你可以在其他线程中发送消息,然后在主线程中更新 UI。 在使用 Handler 更新 UI 的过程中,如果你仍然遇到空指针异常,那么可能是因为你没有正确地初始化 Handler 或者没有正确地发送消息。你可以检查一下你的代码,确保你正确地使用了 Handler。 下面是一个使用 Handler 更新 UI 的示例代码: ``` // 初始化 Handler private Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { // 更新 UI mTextView.setText("Hello, world!"); } }; // 在其他线程中发送消息 new Thread(new Runnable() { @Override public void run() { // 发送消息 mHandler.sendEmptyMessage(0); } }).start(); ``` 在上面的代码中,我们首先创建了一个 Handler 对象,并重写了它的 handleMessage() 方法。然后,在其他线程中发送消息,然后在 handleMessage() 方法中更新 UI。注意,我们使用了 Looper.getMainLooper(),这样可以确保 Handler 在主线程中运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值