抛出空指针exception

我在android中做一个应用程序,我需要访问com.android.internal.telephony API。 现在我能够访问这些API,但问题是我在自己的类中调用Class Call.java的getEarliestConnection()方法,它抛出了NullPointerException 。 你可以在http://hi-android.info/src/com/android/internal/telephony/Call.java.html找到Call.java。 在这个类中有以下方法:

 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; } 

我想在课堂上调用这个方法。 Call.java类我是一个抽象类,我创建了Call类的子类,并调用上面的方法:

 Call myCall = new MyCall(); Connection myConn = new MyConn(); myConn = myCall.getEarliestConnection(); 

但它在上面的方法第10行和第3行上面的代码中引发了NullPointerException

显然getConnections()在这里返回null,你无法获得null-object的大小。

以下是修复方法:

 if (l == null || l.size() == 0) { return null; } 

因此,如果由于某些未知原因,没有Connection-List或列表为空,则返回null 。 使用运算符|| 会做同样的事情

 if (l == null) { return null; } else if ( l.size() == 0) { return null; } 

假设getConnections()返回null,因此l为null,因此尝试调用l.size()会抛出exception。 我们不知道getConnections()做了什么。

请注意,这看起来也很可疑:

 Connection myConn = new MyConn(); myConn = myCall.getEarliestConnection(); 

你为什么要在第一行创建一个MyConn实例,只是再扔掉它? 为什么不使用:

 Connection myConn = myCall.getEarliestConnection(); 

一般来说,值得尽可能晚地声明局部变量,理想情况是当你有一个有用的值时 – 所以在你的方法中,你可以循环中声明c ,在声明中赋值,在赋值点声明l您应该考虑尽可能使用generics – 例如List而不仅仅是原始List类型。

编辑:与接受的答案相反,我建议更改getConnections()始终返回非空值,如果没有连接则返回空列表。 这将更容易使用。

在getConnections()调用之前,您的cm变量从未初始化。 因此,它为null,并且在尝试调用cm.getActiveFgCall()时会出现NullPointerException。

你的方法

 l = getConnections(); 

返回null ,所以你的第10行应该是这样的: if (l==null) {

getEarliestConnection()方法调用getConnections() ,返回null

由于getConnections()Call是抽象的,因此请检查您在MyCall提供的方法。

我想你忘记了

 CallManager cm; cm = new CallManager();