Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
if (rect == null) {
throw new NullPointerException(“Rectangle can't be null”);
}
if (rect == null) {
throw new IllegalArgumentException(“Rectangle can't be null”);
}
assert param != null :
"Param not specified";
-ea:my.package... для тестов, и, иногда, для отладки.Почему, собственно, вряд ли?
assert arg !=null : "..."
//против
checkArgument( arg!=null, "...");
//против вообще отсутствия проверки
Вот все об этом пишут, пишут :) Как вы относитесь к тому что метод Objects#requireNonNull вызывают для проверки аргументов метода и там как раз выкидывается NullPointerException. По сути тоже что пишет автор :)
Calling the instance method of a null object.
Accessing or modifying the field of a null object.
Taking the length of null as if it were an array.
Accessing or modifying the slots of null as if it were an array.
public String(byte bytes[], int offset, int length, Charset charset) {
if (charset == null)
throw new NullPointerException("charset");
checkBounds(bytes, offset, length);
this.value = StringCoding.decode(charset, bytes, offset, length);
}
Конечно, всем известно, что авторы Java плохо программируют на Java…Во-первых, заменять NPE на IAE нужно во всем коде classlib — иначе будет несогласованное поведение. Представляете себе масштаб изменений? И ради чего — ради чуть более логичного поведения? Не убедили.Так я вас и не пытался убедить, что NPE заменять на IAE логично. Я напротив считаю, что так как есть — это нормально. Вообще про NPE в документации ясно сказано:
Applications should throw instances of this class to indicate other illegal uses of the null object.Нет никаких указаний, что это устарело, в новом коде этого следует избегать, или это допустимо только для авторов JDK, но не для простых смертных.
Вы таких людей знаете лично?Знаю, я сам из таких людей. А не нравится этот пример, вот вам другой. Интерфейс java.sql.Connection в 7-й Java получил несколько новых методов, которые отсутствовали в 6-й. Дефолт-функций в седьмой ещё нет, поэтому все, кто реализовал этот интерфейс в 6-й Java, получили некомпилируемый код. Какого-то абстрактного класса типа AbstractConnection, который бы сгладил углы, создав дефолтную реализацию этих методов, тоже не наблюдается. Так что не особо и сильно ребята заморачиваются совместимостью.
void myMethod(...){
checkNotNull(arg1, "arg1 can't be null");
checkArgument(!arg1.isEmpty(),"arg1 can't be empty");
}
И у вас, конечно, есть бенчмарки, показывающие существенную деградацию производительности вашего приложения в версии с новыми строками?По памяти, не по скорости. Расход памяти на ряде задач увеличивался на 10% и выше (для кучи коротких строк оверхед на лишние объекты массивов с выравниванием существенен по сравнению с альтернативой посадить все строки на один буфер). Разумеется, по памяти гораздо проще понять, чем по производительности, где конкретно стало больше расходоваться.
Правильное использование исключений в Java