2012-03-13 4 views
1

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

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), он дает исключение в случаях, когда x равно null. Как я могу достичь этой функциональности?

+0

Как вы можете вернуть null и назначить его переменной int z ?? Его несоответствие типа. – Muse

+0

Ни одна из написанных вами версий не должна бросаться, если только это не '' get', которое выбрасывает. Вы уверены, что ищете правильную часть своего кода? – Mat

+0

Вот почему я поставил эту регистрацию, если состояние. –

ответ

4

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

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

int z = y.get(); 

Это, как говорят:

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

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

Integer z = y.get(); 

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

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

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

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

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

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

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

Смежные вопросы