Android app NullPointerException 哪里不应该发生?
Android app NullPointerException where it should not happen?
我有一个最近发布的 Android 应用程序,我正在从 Google Play 控制台收到崩溃报告。其中一次崩溃很奇怪。它发生在类似于以下的代码中:
private final List<Item> items = new ArrayList<>();
public void addItem(Item item) {
items.add(item); // NullPointerException here!!
}
显然items
在调用addItem
时为null,但在我看来这是不可能的——我已经在声明站点初始化了它。我无法想象这种情况会发生,但这种情况经常发生。有什么想法吗?
好了,心理调试时间到了。 仅 可能发生这种情况的方式是,如果在设置其他变量或显式 init { ... }
块期间将其作为对象 init 的一部分进行调用。
您几乎可以肯定在代码的其他地方做了类似的事情:
import java.util.*;
class Main {
private static class Item { }
private final Item firstItem = setUpItemsAndReturnFirst();
private final List<Item> items = new ArrayList<>();
public void addItem(Item item) {
items.add(item); // NullPointerException here!!
}
private Item setUpItemsAndReturnFirst() {
Item first = new Item();
Item second = new Item();
addItem(first);
addItem(second);
return first;
}
public static void main(String args[]) {
new Main();
}
}
这包含您的示例代码,并且会在带有 NullPointerException
的那一行崩溃,因为 setUpItemsAndReturnFirst()
在 items
用于初始化 [=15] 的初始化之前被调用=].
我假设它在某种条件下,在你的情况下,因为它可能不会 每次 崩溃,否则你永远不会发布它。但这是总体思路。
我有一个最近发布的 Android 应用程序,我正在从 Google Play 控制台收到崩溃报告。其中一次崩溃很奇怪。它发生在类似于以下的代码中:
private final List<Item> items = new ArrayList<>();
public void addItem(Item item) {
items.add(item); // NullPointerException here!!
}
显然items
在调用addItem
时为null,但在我看来这是不可能的——我已经在声明站点初始化了它。我无法想象这种情况会发生,但这种情况经常发生。有什么想法吗?
好了,心理调试时间到了。 仅 可能发生这种情况的方式是,如果在设置其他变量或显式 init { ... }
块期间将其作为对象 init 的一部分进行调用。
您几乎可以肯定在代码的其他地方做了类似的事情:
import java.util.*;
class Main {
private static class Item { }
private final Item firstItem = setUpItemsAndReturnFirst();
private final List<Item> items = new ArrayList<>();
public void addItem(Item item) {
items.add(item); // NullPointerException here!!
}
private Item setUpItemsAndReturnFirst() {
Item first = new Item();
Item second = new Item();
addItem(first);
addItem(second);
return first;
}
public static void main(String args[]) {
new Main();
}
}
这包含您的示例代码,并且会在带有 NullPointerException
的那一行崩溃,因为 setUpItemsAndReturnFirst()
在 items
用于初始化 [=15] 的初始化之前被调用=].
我假设它在某种条件下,在你的情况下,因为它可能不会 每次 崩溃,否则你永远不会发布它。但这是总体思路。