`
dongya1987
  • 浏览: 47775 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

List.add(null)可能导致的问题

 
阅读更多

android 4.1中有应用报出:

java.lang.NullPointerException

at android.widget.TextView.sendBeforeTextChanged(TextView.java:7044)

而往下的log信息都没有应用相关的信息,只知道被它搞死的应用是哪个。后发现该应用中有这么一行代码:

searchEdit.addTextChangedListener(null);

下面说明为什么这么一行会把应用搞死。

 

TextView.java中的如下函数:

 

public void addTextChangedListener(TextWatcher watcher) {
    if(mListeners == null) {
        mListeners  = new ArrayList<TextWatcher >();
    }
    
    mListeners.add(watcher);
}

 

 

private void sendBeforeTextChanged(CharSequence text, int start, int before, int after) {
    if(mListeners != null) {
         final ArrayList<TextWatcher> list = mListeners;
         final int count = list.size();
         for(int i = 0; i < count; i++) {
              list.get(i).beforeTextChanged(text, start, before, after);
         }
    }
    ....
}

 上面 list.get(i).beforeTextChanged这行之所以会报空指针,是因为虽然做了list非空的判断,也在for循环了限制了i的大小,但这并不能说明list.get(i) != null. 

 

做个了试验:

 

        ArrayList<String> list = new ArrayList<String>();
        list.add(null);
        System.out.println("list.size()="+list.size());
        System.out.println("list.get(0)="+list.get(0));

 

输出结果如下:

 

 

list.size()=1
list.get(0)=null

 

以后的警示:

1. 尽量不执行list.add(null);

2. 在list的循环时,要对取出来的元素再做非空判断。

分享到:
评论

相关推荐

    浅谈List.h,list.h函数解析

    list_del函数将一个节点从链表中删除,并将其next和prev指针设置为NULL。 5. 链表的遍历 链表的遍历可以通过list_for_each宏来实现。list_for_each宏是一个foreach循环,用于遍历链表中的每个节点。 6. 链表的...

    WindowsFormsApp2.7z

    list.Add(new StepEntity("1", "", 1, "步骤1", eumStepState.Completed, null)); list.Add(new StepEntity("2", "", 2, "步骤2", eumStepState.Completed, null)); list.Add(new StepEntity("3", "", 3, "步骤...

    浅谈C#中ListT对象的深度拷贝问题

    一、List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List&lt;T&gt; oldList = new List(); oldList.Add(..); List&lt;T&gt; newList = new List(oldList); 二、List对象中的T是引用...

    吐血推荐17个提升开发效率的“轮子”.doc

    if (list == null || list.size() == 0) { return Collections.emptyList(); } //业务处理 return list; } 5. 二分查找:Collections.binarySearch() 方法提供了二分查找功能。 例如: List list = new ...

    android 仿ipone气泡短信—自定义list

    private List&lt;DetailEntity&gt; list = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listInit(); } public void ...

    北大青鸟第二单元项目

    list.add(user); } } catch (Exception e) { e.printStackTrace(); }finally{ closeAll(rs, pstmt, conn); }return list; } //分页查询用户 public List&lt;User&gt; getUsersByPager(Pager pager,...

    Android 获取移动网络及SIM卡运营商信息.rar

     listValues.add((tm.getDeviceSoftwareVersion()==null?tm.getDeviceSoftwareVersion():"未知")); //获取软件版本  listValues.add(tm.getNetworkOperator());//获取网络运营商代号  listValues.add(tm....

    1.类集-introdute.doc

    这意味着在多线程环境中,如果不采取同步措施,使用ArrayList可能会遇到数据不一致的问题。 在实际使用中,我们可以通过以下代码示例了解ArrayList的基本操作: ```java import java.util.ArrayList; public ...

    list转换成string数组

    - **数组长度**:当使用`new String[list.size()]`创建数组时,确保列表中的元素数量与数组长度一致,避免出现数组越界的问题。 - **性能考虑**:在转换过程中,尽量减少不必要的对象创建,尤其是当列表很大时,这...

    set.list.map接口

    在Java编程语言中,集合框架是处理对象的重要工具,其中包括Set、List和Map三大接口。这些接口提供了多种数据结构和操作方法,使得开发者能够高效地组织和管理数据。 1. **Set接口**: Set接口表示一个不包含重复...

    String[] list 相互转化

    list.add("1"); list.add("2"); // 获取 List 大小并创建一个 String 类型的数组 final int size = list.size(); String[] arr = (String[]) list.toArray(new String[size]); ``` 这里的关键点在于 `list.toArray...

    Database_List.zip_databaseList

    list.Add(item); } return list; } ``` 这个方法通过反射获取T类型中与DataTable列名匹配的属性,并将数据赋值给新创建的对象。完成后,该对象被添加到List中。逆向转换,即从List到DataTable,可以类似地实现,...

    Android代码-安卓图片缓存和bannerview结合

    list.add(getLayoutInflater().inflate(R.layout.guide_page1, null)); list.add(getLayoutInflater().inflate(R.layout.guide_page2, null)); list.add(getLayoutInflater().inflate(R.layout.

    基于Java的二叉树层序遍历打印实现.docx

    = null) q.add(node.left); if (node.right != null) q.add(node.right); } int[] res = new int[list.size()]; for (int i = 0; i &lt; res.length; i++) res[i] = list.get(i); return res; } ``` 2. **分层...

    几个java作业小题代码

    - 使用 `Iterator` 迭代列表并移除元素比直接在 `for` 循环中移除更安全,因为后者可能导致并发修改异常。 3. **移除列表中的元素:** - 在遍历过程中通过 `Iterator` 的 `remove` 方法移除满足条件的元素。 **...

    全国ITAT大赛复赛编程

    4. **重复步骤2和3**:由于合并操作可能导致新的集合间出现交集,因此需要重复进行步骤2和3直到列表中的所有集合之间不再存在交集为止。 #### 算法复杂度分析 - **时间复杂度**:主要消耗在于双重循环遍历列表中的...

    Java中有关Null的9件事Java开发Java经验技巧

    在并发环境中,多个线程同时访问和修改`null`引用可能导致不确定的行为。确保在并发操作中正确同步和管理`null`引用。 了解并熟练应用这些知识点能显著提高Java代码的健壮性和可靠性,避免因`null`引起的运行时...

    JAVALIST.rar_single

    例如,对于单链表的实现,`JAVALIST.java`可能包含以下代码片段: ```java public class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } public class ...

    3. 高级界面开发2Command事件和List3.rar

    List list = new List("列表示例", Choice.IMPLICIT, items, null); ``` 5. 设置List的Command事件处理: ```java list.addCommand(command); list.setCommandListener(new CommandListener() { public void ...

    Hibernate实体查询(ceriteria)精解

    .add(Restrictions.isNull("age")) .add(Restrictions.eq("age", new Integer(0))) .add(Restrictions.eq("age", new Integer(1))) .add(Restrictions.eq("age", new Integer(2))) ) .list(); ``` #### 三、...

Global site tag (gtag.js) - Google Analytics