【问题标题】:NullPointerException is Getting Thrown on ArrayList.add(String)NullPointerException 在 ArrayList.add(String) 上被抛出
【发布时间】:2015-08-27 17:02:02
【问题描述】:

我正在尝试将字符串添加到先前从内部存储文件中提取的 ArrayList。但是,在这一行会抛出 NullPointerException。

ArrayList<String> names = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    createLayout();
    next.setOnClickListener(new View.OnClickListener() {
    @SuppressWarnings("unchecked")
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    String tripName = tripNameET.getText().toString(); //tripNameET is the EditText that provides the String to be put in the ArrayList
...
    FileInputStream fis1 = null;
    ObjectInputStream ois1 = null;
    try {
       fis1 = openFileInput("names");
       ois1 = new ObjectInputStream(fis1);
       names = (ArrayList<String>) ois1.readObject();
       ois1.close();
       fis1.close();
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    } catch (ClassNotFoundException e) {
       e.printStackTrace();
    }
    names.add(tripName); //NPE is Thrown Here
...
  }
}

【问题讨论】:

  • 这只是表示names为null,所以ois1.readObject()返回null。

标签: java android arraylist nullpointerexception


【解决方案1】:

try 块中的代码失败,因此 names 永远不会被初始化。然后,您在尝试将项目添加到 names(仍为 null)时遇到错误。


编辑: 进一步调试的一个好方法是在 try 块的行之间添加一些 Log 语句,以查看哪一行失败,然后进一步调查该行.

试试这个:

try {
    Log.i("CHECKPOINT", "1");
    fis1 = openFileInput("names");
    Log.i("CHECKPOINT", "2");
    ois1 = new ObjectInputStream(fis1);
    Log.i("CHECKPOINT", "3");
    names = (ArrayList<String>) ois1.readObject();
    Log.i("CHECKPOINT", "4");
    ois1.close();
    Log.i("CHECKPOINT", "5");
    fis1.close();
    Log.i("CHECKPOINT", "6");
}

现在再次运行您的代码并检查 logcat 以查看上次注销的语句是什么。


编辑 2:如果所有六个日志语句都打印成功,则表明 try没有失败。我们仍然知道names 为空。使用以下代码确认这一点:

try {
    fis1 = openFileInput("names");
    ois1 = new ObjectInputStream(fis1);
    names = (ArrayList<String>) ois1.readObject();

    // indicates if names is really null
    Log.i("names is ", (names == null) ? "null" : "not null"); 

    ois1.close();
    fis1.close();
}

如果假设是正确的,并且namesnull,您需要做一些调查以找出为什么ois1.readObject(); 会返回null

  • 文件names 是空的吗?
  • 是否需要命名为names.txt
  • 在什么情况下.readObject()会返回null?

希望这会有所帮助,祝你好运:-)

【讨论】:

  • 如何阻止 try 块失败?
  • @JenglandDev 好问题,我在帖子中添加了更多信息。
  • 他们都被记录了。 catch 语句与此有关吗?
  • 有趣,这实际上意味着 try 块没有失败。我会再次更新我的答案。
  • 顺便说一句,如果您发现这是一个有用的答案,请将其标记为正确 :-)
【解决方案2】:

tripName 为空,这就是为什么您在尝试添加列表时会收到 NPE。 只需在添加到列表之前添加一个简单的检查即可。

     if(tripName!=null){
        names.add(tripName);
      }

【讨论】:

    【解决方案3】:

    名称可能从 readObject() 反序列化为 null。

    this question

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多