Почему сравнение Integer с int может вызвать исключение NullPointerException в Java?

Мне было очень странно наблюдать за этой ситуацией:

Integer i = null;
String str = null;

if (i == null) {   //Nothing happens
   ...                  
}
if (str == null) { //Nothing happens

}

if (i == 0) {  //NullPointerException
   ...
}
if (str == "0") { //Nothing happens
   ...
}

Так что, как я думаю, сначала выполняется операция бокса (т.е. java пытается извлечь значение int изnull) и операция сравнения имеет более низкий приоритет, поэтому генерируется исключение.

Вопрос в том, почему это реализовано в Java? Почему бокс имеет более высокий приоритет, чем сравнение ссылок? Или почему они не осуществили проверку противnull перед боксом?

На данный момент это выглядит противоречивым, когдаNullPointerException брошен с завернутыми примитивами и не брошен справда типы объектов.