Подтвердить что ты не робот

Вложенное значение распаковано, а затем переустановлено

FindBugs дает мне предупреждение о следующей строке, где invoiceNumber - объект Integer:

text.append(String.format("%010d-", (invoiceNumber == null) ? 0 : invoiceNumber));

Предупреждение: "Вложенное значение распаковано, а затем немедленно переустановлено"

Теперь я думаю, что понимаю (не) бокс, но я не вижу, как бы вы сделали то же самое, не получив предупреждения?

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

int invNo = (invoiceNumber == null) ? 0 : invoiceNumber;
text.append(String.format("%010d-", invNo));

Может кто-нибудь показать мне, что такое "правильный" способ сделать выше?

Кстати, я просмотрел связанные вопросы, и я понимаю, что с ними происходит, но это, похоже, не соответствует ни одному из них.

4b9b3361

Ответ 1

Тип выражения (invoiceNumber == null) ? 0 : invoiceNumber) int. Он требует распаковки invoiceNumber в случае invoiceNumber не null.

С другой стороны, String.format ожидает один аргумент String, за которым следуют ссылки Object, что означает, что ваш int снова будет удален в поле Integer.

Вы можете попытаться избежать первоначального распаковки с помощью (invoiceNumber == null) ? Integer.valueOf(0) : invoiceNumber), который заставит это выражение возвращать Integer.

Ответ 2

Попробуйте изменить (invoiceNumber == null) ? 0 : invoiceNumber на (invoiceNumber == null) ? 0 : invoiceNumber.intValue(). Я думаю, что предупреждение приходит от вас, используя Integer снова в "ложном" случае, а не int.