Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在引发空指针异常_Java_Android_Nullpointerexception - Fatal编程技术网

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.

我正在用android做一个应用程序,我需要访问com.android.internal.telephony API。现在我可以访问这些API了,但问题是在我自己的类中调用Class call.java的getEarliestConnection方法的任何地方,它都会抛出NullPointerException。 您可以在这里找到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;
    }
但它在上述方法的第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();