调用List<String>.size()导致Android设备上APP崩溃的问题排查
问题分析与解决
崩溃核心原因
你遇到的崩溃根本不是空指针异常,而是TextView的setText(int)方法被误用。
TextView有多个重载的setText方法:
setText(String):直接显示传入的字符串内容setText(int):传入的int会被当作Android资源ID(比如R.string.xxx)去查找对应的字符串资源
当你调用testTextView.setText(list.size())时,list.size()返回的是2,系统会去查找ID为2的字符串资源,显然不存在,就会抛出Resources$NotFoundException,导致APP崩溃。而调用testTextView.setText(list.get(0))时,传入的是String类型,匹配了正确的重载方法,所以能正常运行。
解决方案
把列表长度转换成字符串类型再传入即可,几种简单写法:
- 拼接空字符串:
testTextView.setText(list.size() + ""); - 使用
String.valueOf():testTextView.setText(String.valueOf(list.size())); - 使用
Integer.toString():testTextView.setText(Integer.toString(list.size()));
关于空指针异常的可能原因
虽然你这次的问题不是空指针,但如果确实出现空指针,可能的原因有:
- TextView未正确初始化:如果
findViewById(R.id.testText)是在onCreate方法之外调用的(比如你代码里直接声明的位置,此时Activity还没完成布局加载),testTextView会是null,调用setText就会触发空指针。正确做法是把findViewById放在onCreate的setContentView之后。 - List对象为null:如果
list没有被初始化(比如List<String> list = null;),调用list.size()或list.get(0)都会触发空指针。但你这里用Arrays.asList创建了有效列表,所以排除这种情况。 - 布局文件中不存在对应ID的TextView:如果布局里没有
testText这个ID的控件,findViewById会返回null,调用setText也会空指针。
内容的提问来源于stack exchange,提问作者fireslide
相关产品推荐
相关产品推荐

