Вы на самом деле выявили одну из самых больших дыр в системе Java, в которой обычно пытаются найти ошибки во время редактирования / компиляции, а не во время выполнения, потому что - как сказал принятый ответ - трудно сказать, инициализирован ли b или нет.
Есть несколько шаблонов, чтобы обойти этот недостаток. Первый - «Окончательный по умолчанию». Если бы ваши члены были финальными, вам нужно было бы заполнить их конструктором - и он использовал бы анализ пути, чтобы убедиться, что каждый возможный путь заполняет финалы (вы все равно можете назначить ему «Null», что бы победить цель, но по крайней мере, вам придется признать, что вы делали это намеренно).
Второй подход - строгая проверка нуля. Вы можете включить его в настройках затмения по проекту или по умолчанию. Я полагаю, что это заставит вас проверять ноль вашего b.notify () перед вызовом. Это может быстро выйти из-под контроля, поэтому обычно есть несколько аннотаций, упрощающих процесс:
У аннотаций могут быть разные имена, но в принципе, когда вы включаете строгую проверку на ноль, а аннотации типов переменных "обнуляемый" и "NotNull". Если вы попытаетесь поместить Nullable в ненулевую переменную, вы должны сначала проверить его на нуль. Параметры и типы возвращаемых данных также аннотированы, поэтому вам не нужно проверять нулевое значение каждый раз, когда вы присваиваете ненулевой переменной.
Существует также аннотация уровня пакета NotNullByDefault, которая заставит редактора предположить, что ни одна переменная не может иметь нулевое значение, если вы не пометите ее как Nullable.
Эти аннотации в основном применяются на уровне редактора. Вы можете включить их в затмении и, возможно, в других редакторах, поэтому они не обязательно стандартизированы. (По крайней мере, в прошлый раз, когда я проверяю, Java 8 может иметь некоторые аннотации, которые я еще не нашел)