Тернарный оператор с картой NullPointerException Java - PullRequest
0 голосов
/ 12 января 2020

Сомнение здесь в том, что если ключа на карте нет, он возвращает ноль, и здесь я пытаюсь получить это в Integer.

import java.util.*;
class Main {
  public static void main(String[] args) {
    HashMap<String,Integer> hm =new HashMap<>();
    hm.put("abc",1);
    hm.put("xyz",1);
    System.out.println(hm.get("pqr"));
    Integer result = hm !=null ? hm.get("pqr") : 0;
    System.out.println(result);
  }
}

Вывод:

null
Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:10)

Если я разделю троичный оператор на if-else Например:

import java.util.*;
public class TestMain {
    public static void main(String[] args) {
        HashMap<String,Integer> hm =new HashMap<>();
        hm.put("abc",1);
        hm.put("xyz",1);
        System.out.println(hm.get("pqr"));
        Integer result;
        if ( hm != null){
          result = hm.get("pqr");
        } else
            result =0;
        System.out.println(result);
    }
}

Вывод:

null
null

Что не так в троичном операторе?

Ответы [ 4 ]

3 голосов
/ 12 января 2020

Тип троичного условного выражения

hm !=null ? hm.get("pqr") : 0

равен int, поэтому hm.get("pqr") (значение которого null) распаковано в int, что означает NullPointerException.

Чтобы избежать этого, вы можете написать:

Integer result = hm !=null ? hm.get("pqr") : Integer.valueOf(0);

Теперь тип троичного условного выражения будет Integer, поэтому не будет попытки распаковать hm.get("pqr"), и без исключений.

Лог c, определяющий тип троичного условного оператора, можно найти в 15.25. Условный оператор? : в Table 15.25-A и Table 15.25-C.

0 голосов
/ 12 января 2020

Если ключ на карте отсутствует, возвращается ноль. Далее вы подтвердите в соответствии с ключом.

Integer result = hm !=null ? ((hm.get("pqr") != null ? hm.get("pqr"): 0)):0;
// result 0 or value
0 голосов
/ 12 января 2020

На карте нет ключа pqr, поэтому hm.get ("pqr") возвращает нулевое значение. Если вы проверяете объект, он возвращает ноль. Поэтому вы можете изменить объект на ключ, он получит значение успеха.

public static void main(String[] args) {
        Map<String, Integer> hm = new HashMap<>();
        hm.put("abc", 1);
        hm.put("xyz", 1);
        System.out.println(hm.get("pqr"));    
        Integer result = hm.get("pqr") !=null ? hm.get("pqr") : 0;
        System.out.println(result);
    }

Вывод: ноль, 0

Спасибо,

0 голосов
/ 12 января 2020

В HashMap нет ключа pqr, поэтому hm.get("pqr") возвращает null.

result = hm.get("pqr"); // result is null

Из Документов

Возвращает: значение, которому сопоставлен указанный ключ, или ноль, если эта карта не содержит сопоставления для ключа

...