抛出空指针异常

时间:2012-01-05 10:49:47

标签: java android nullpointerexception

我在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

6 个答案:

答案 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();