我在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
。
答案 0 :(得分:4)
大概getConnections()
返回null,因此l
为空,因此尝试调用l.size()
会抛出异常。我们不知道getConnections()
做了什么。
请注意,这看起来也很可疑:
Connection myConn = new MyConn();
myConn = myCall.getEarliestConnection();
为什么要在第一行创建MyConn
的实例,只是将其丢弃?为什么不直接使用:
Connection myConn = myCall.getEarliestConnection();
一般来说,值得尽可能晚地声明局部变量,理想情况是当你有一个有用的值时 - 所以在你的方法中,你可以在循环中声明c
,赋值t
声明中的值,在赋值点声明l
等。您还应该考虑在可能的情况下使用泛型 - 例如List<MyConn>
而不仅仅是原始List
类型。
编辑:与接受的答案相反,我建议将getConnections()
更改为始终返回非空值,如果没有连接则返回空列表。这将更容易使用。
答案 1 :(得分:2)
在getConnections()调用之前,您的cm变量从未初始化。因此,它为null,并且在尝试调用cm.getActiveFgCall()时会出现NullPointerException。
答案 2 :(得分:1)
显然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;
}
答案 3 :(得分:0)
你的方法
l = getConnections();
返回null
,因此您的第10行应如下所示:if (l==null) {
答案 4 :(得分:0)
方法getEarliestConnection()
调用getConnections()
,返回null
。
由于getConnections()
中的Call
是抽象的,请检查您在MyCall
中提供的方法。
答案 5 :(得分:0)
我想你忘记了
CallManager cm;
cm = new CallManager();