Исключение пустого указателя - PullRequest
0 голосов
/ 05 января 2012

Я делаю одно приложение в Android для этого мне нужно получить доступ к API com.android.internal.telephony. Теперь я могу получить доступ к этим API, но проблема в том, где я вызываю getEarliestConnection() метод класса Call.java в своем собственном классе, он выдает NullPointerException. Вы можете найти Call.java здесь http://hi -android.info / src / com / android / internal / telephony / Call.java.html . В этом классе есть следующий метод:

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

Но он выбрасывает NullPointerException в строке № 10 вышеприведенного метода и в строке № 3 вышеприведенного кода.

Ответы [ 6 ]

4 голосов
/ 05 января 2012

Предположительно getConnections() возвращает ноль, поэтому l равно нулю, поэтому попытка вызова l.size() вызывает исключение.Мы не знаем, что делает getConnections().

Обратите внимание, что это тоже выглядит подозрительно:

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

Почему вы создаете экземпляр MyConn только в первой строкевыбросить снова?Почему бы просто не использовать:

Connection myConn = myCall.getEarliestConnection();

В общем случае локальные переменные следует объявлять как можно позже, в идеале, когда у вас есть полезное значение - поэтому в вашем методе вы можете объявить c в цикле присвойте t значение в объявлении, объявите l в точке назначения и т. д. Вы также должны рассмотреть возможность использования обобщений, где это возможно - например, List<MyConn> вместо просто необработанных Listвведите.

РЕДАКТИРОВАТЬ: В отличие от принятого ответа, я бы предложил изменить getConnections() на всегда , чтобы вернуть ненулевое значение, возвращая пустой список, если нет соединений.С этим будет легче работать.

2 голосов
/ 06 января 2012

Ваша переменная cm никогда не инициализировалась до вызова getConnections (). Таким образом, оно равно null, и вы получаете NullPointerException при попытке вызвать cm.getActiveFgCall ().

1 голос
/ 05 января 2012

Очевидно, getConnections() возвращает здесь ноль, и вы не можете получить размер нулевого объекта.

Вот как это исправить:

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

Итак, если по неизвестной причине, список подключений отсутствует или список пуст, будет возвращено null.Использование оператора || сделает то же самое, что и

if (l == null)
{
    return null;
}
else if ( l.size() == 0)
{
    return null;
}
0 голосов
/ 06 января 2012

Я думаю, что вы забыли

CallManager cm;    
cm = new CallManager();
0 голосов
/ 05 января 2012

Метод getEarliestConnection() вызывает getConnections(), который возвращает null.

Поскольку getConnections() является абстрактным в Call, проверьте метод, который вы указали в MyCall.

0 голосов
/ 05 января 2012

Вы метод

l = getConnections();

возвращает null, поэтому ваша строка 10 должна выглядеть следующим образом: if (l==null) {

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...