Если используется функция, которая может вернуть ноль - PullRequest
1 голос
/ 13 марта 2012

Существует функция get (), которая возвращает значение, если оно есть в ArrayDeque, в противном случае возвращает null , т. Е. X может быть некоторым значением или нулем.Если get () возвращает x, то функция B () должна выполнить некоторые вычисления, иначе не должна ничего делать.

T get()
{
    //compute x
    return x;
}

void B()
{
     int z;
     if(y.get()!=null)
     {
          z=y.get(); // gives null pointer exception
          .....
     }
}

Проблема в том, что y.get () уже возвращает значение, которое не присвоено какой-либо переменной, таким образом, дает исключение нулевого указателя.Если я использую что-то вроде if((z=y.get()) != 0), это дает исключение в тех случаях, когда х равен нулю.Как я могу достичь этой функциональности?

1 Ответ

4 голосов
/ 13 марта 2012

Я подозреваю, что это ArrayDeque<Integer>, верно?

Когда у вас есть:

int z = y.get();

Это все равно что сказать:

int z = ((Integer) y.get()).intValue();

Просто используйте:

Integer z = y.get();

вместо.Затем вы можете проверить, является ли z нулевым.С другой стороны, если y.get() уже вернул ненулевое значение, я удивляюсь, если это , тогда возвращает значение null - вы ожидаете, что оно будет возвращать одно и то же дважды,право?Вовлечены ли другие потоки?

Кроме того, неясно, что вы подразумеваете под этим:

Проблема в том, что y.get() уже возвращает значение, которое не присвоено какой-либо переменной, таким образом, дает исключение нулевого указателя.

Я не вижу, где здесь "таким образом" ... нормально вызывать метод, а не сохранять возвращаемое значение в переменной.Если это выбрасывает NullPointerException, это действительно означает, что y равно нулю.Конечно, все это будет легче диагностировать, если вы опубликуете короткую, но полную программу, демонстрирующую проблему.

Кстати, неясно, почему вы сначала звоните y.get() дважды,Я бы перестроил код так:

void B()
{
     Integer z = y.get();
     if (z != null)
     {
         // Use z
     }
}

Вы действительно хотите вызвать его дважды?

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