Java 正在引发空指针异常
我正在用android做一个应用程序,我需要访问com.android.internal.telephony API。现在我可以访问这些API了,但问题是在我自己的类中调用Class call.java的getEarliestConnection方法的任何地方,它都会抛出NullPointerException。 您可以在这里找到Call.java。在该类中,有以下方法:Java 正在引发空指针异常,java,android,nullpointerexception,Java,Android,Nullpointerexception,我正在用android做一个应用程序,我需要访问com.android.internal.telephony API。现在我可以访问这些API了,但问题是在我自己的类中调用Class call.java的getEarliestConnection方法的任何地方,它都会抛出NullPointerException。 您可以在这里找到Call.java。在该类中,有以下方法: 1. public Connection 2. getEarliestConnection() { 3.
1. public Connection
2. getEarliestConnection() {
3. List l;
4. long time = Long.MAX_VALUE;
5. Connection c;
6. Connection earliest = null;
7.
8. l = getConnections();
9.
10. if (l.size() == 0) {
11. return null;
12. }
for (int i = 0, s = l.size() ; i < s ; i++) {
c = (Connection) l.get(i);
long t;
t = c.getCreateTime();
if (t < time) {
earliest = c;
time = t;
}
}
return earliest;
}
但它在上述方法的第10行和上述代码的第3行抛出了一个NullPointerException 可能getConnections返回null,因此l为null,因此尝试调用l.size会引发异常。我们不知道getConnections做什么
请注意,这看起来也很可疑:
Connection myConn = new MyConn();
myConn = myCall.getEarliestConnection();
为什么您在第一行创建MyConn实例,却又把它扔掉了?为什么不直接使用:
Connection myConn = myCall.getEarliestConnection();
一般来说,尽可能晚地声明局部变量是值得的,理想情况下,当你有一个有用的值时-因此在你的方法中,你可以在循环中声明c,在声明中为t赋值,在赋值点声明l,您还应该考虑在可能的情况下使用泛型——例如列表而不是原始列表类型。
编辑:与公认的答案相反,我建议将getConnections更改为始终返回非空值,如果没有连接,则返回空列表。这将更容易使用。您可以使用这种方法
l = getConnections();
返回null,因此第10行应该如下所示:如果l==null{方法getEarliestConnection调用getConnections,返回null
由于getConnections在Call中是抽象的,请检查MyCall中提供的方法。显然,getConnections在这里返回null,您无法获得null对象的大小
以下是修复方法:
if (l == null || l.size() == 0)
{
return null;
}
因此,如果由于某种未知原因,没有连接列表或列表为空,将返回null
if (l == null)
{
return null;
}
else if ( l.size() == 0)
{
return null;
}
在getConnections调用之前,您的cm变量从未初始化过。因此,它为null,并且在尝试调用cm.getActiveFgCall时会出现NullPointerException。我想您忘记了
CallManager cm;
cm = new CallManager();
Bcoz连接类是一个抽象类,所以我创建了连接类的子类。为什么在第一行创建MyConn的实例,却又把它扔掉了?为此,我commented@shiv1229:但是你的评论并不能解释你为什么这么做。为什么要给变量赋值,然后立即赋值变量的用途?仅仅因为你有一个抽象类并不能解释这一行代码。如果构造函数有副作用,你可以调用它而不给变量赋值,并添加注释来说明为什么要这样做。@shiv1229:请参阅我的编辑,以获得对NullPointerException的另一种修复方法。一般来说ing,返回集合的方法最好返回空集合,而不是空引用-如果更改getConnections方法,则无需更改getEarliestConnection方法。让我们非常感谢您,我会尝试it@Artm:谢谢你的回复。我试图初始化它,但我不能。如何初始化这个。请帮助我。打电话Manager是一个内部类,你打算怎么做?@WarrenFaith:什么是OP。我没有得到OP代表原始海报,就是你!你的第10行比错误低两行。Thx deepak,我试过了,但它显示了这样一个错误:“构造函数CallManager不可见”。我想它是CallManger.jav的bcoza是一个filal修饰符。否。这是因为CallManager的构造函数不是公共的。Final修饰符意味着类不能被伪造。CallManager是一个内部使用的类。即使您可以实例化ite。例如,使用反射,也不能保证它能正常工作。
CallManager cm;
cm = new CallManager();