抛出空指针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();