2013-09-11 3 views
1

Я знаю, что этот вопрос задан несколько раз, но я не нашел правильного ответа на вопрос. Как избежать исключения NullPointerException при получении результатов из ConcurrentHashMap. У меня есть код ниже, который бросает мне NullPointer.Избегайте исключения nullpointer с ConcurrentHashMap

public static String getPersonInfo(String personAddress) { 
    //if(concMap!=null && concMap.containsKey(personAddress))  
    return concMap.get(personAddress); 
      //return null; 
} 

В параллельной HashMap, я храню человек идентификатор и адрес в параллельном HashMap. В некоторых случаях идентификатор равен null. Хотя я делаю нулевую проверку перед помещением данных на карту, я все равно получаю следующую ошибку при попытке прочитать данные.

java.lang.NullPointerException 
at java.util.concurrent.ConcurrentHashMap.get(Unknown Source) 

Кто-то пожалуйста, помогите :(Я потратил более 3 часов, пытаясь отладки это. Хотя я вижу много сообщений в Интернете, я не очень понятно с тем, что можно сделать, чтобы избежать этого.

ответ

4

ли нулевой чек на personAddress, вызывая прибудете (нуль) бросает NPE это даже указано в методе documentation

+0

Я сделал нулевую проверку, как вы можете видеть в строках, которые прокомментированы. Это не помогло. – rickygrimes

+0

Прочтите мой ответ еще раз - personAddress имеет значение null, вы проверяете concMap. Заметьте, что containsKey также будет бросать NPE, если вы вызываете его с помощью нулевого параметра. –

+0

Нет, вы не сделали нулевой чек на personAddress ;-) – weiglt

0

Try это, чтобы избежать пустой ключ с карты:.

public static String getPersonInfo(String personAddress) { 
    //if(concMap!=null && concMap.containsKey(personAddress))  
    return (personAddress != null) ? concMap.get(personAddress) : null; 
} 
1

Это невозможно. В API указано, что этот метод генерирует только NPE, если ключ имеет значение null. Вы должны использовать отладчик, где-то ваш нулевой чек не выполняется. Я также не понимаю, почему вы разместили код с комментариями. Что это значит? Это ваша нулевая проверка? Почему это прокомментировано?

+0

Я прокомментировал это, так как это не помогло. Да, ключ в null в нескольких случаях, а в некоторых случаях значение равно null. – rickygrimes

+0

Хорошо, проблема в том, что вы проверили concMap на null, но вы должны проверить personAddress на null;) Поскольку personAddress является ключом и API-интерфейсом, этот NPE вызывается, когда ключ имеет значение null. Значение ok равно null. - В принципе, вы можете, конечно, также проверить concMap для null, но это только в случае, если оно может быть нулевым. – weiglt

+0

@weigit - Конечно, я сделаю это. Но я просто проверил его сбой, когда значение для данного ключа равно null. Как мне избежать этого? – rickygrimes

0

Если вы используете (или планируете использовать) JetBrains Idea, Java-идеал, вы можете использовать некоторые конкретные аннотации, разработанные ими.

В принципе, у вас есть @Nullable и @NotNull.

3

Это ключ, который является нулевым, что в данном случае является personAddress (как все говорят). Тем не менее, было бы безопаснее, чтобы проверить их все:

public static String getPersonInfo(String personAddress) { 
    if (personAddress != null && concMap != null && concMap.containsKey(personAddress)) {  
    return concMap.get(personAddress); 
    } 
    return null; 
} 

Я хотел бы добавить, что способность почти все, но примитивы быть нулевым является общей головной болью в Java. Большинство внутренних методов даже не беспокоиться об этом и просто бросать NPE. Если что-то не может быть пустым вниз, проверьте это с вашей первой значимой возможностью.

+0

Согласен, это, наверное, самый безопасный способ.Но также можно жить с исключением и справиться с этим ... – weiglt

+0

Абсолютно. Не утруждайте себя вызовом 'getPersonInfo()', если 'personAddress' имеет значение NULL и имеет дело с исключениями в противном случае. – wwwslinger

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