Здравствуйте, Baudolino, Вы писали:
B>>Что ж все такие скептичные "ошибка", "идиоты". Всё там нормально. Сначала проверется на null, потом валидируется значение. B>Где логика?
Логика в том что неверное значение и отсутствующее значение это не одно и тоже.
Re[6]: Проверяют ли в Java аргументы метода на null?
B>Дальше второго поста не дочитал?
Читал. Товарищ, за которого проголосовало на треть меньше народу, считает, что это "best practice". Но это не аргумент.
Re[4]: Проверяют ли в Java аргументы метода на null?
B> if (oldContext == null)
B> throw new NullPointerException();
B> /* Check that the restored context is in the stack. */
B> for (ThreadContext context = getContext();
B> context != oldContext;
B> context = context.previous) {
B> if (context == null) {
B> throw new IllegalArgumentException("Restored context is not " +
B> "contained in current " +
B> "context");
B> }
B> }
B>
Гы. В том же классе:
if (key == null)
throw new IllegalArgumentException("null key");
Re[6]: Проверяют ли в Java аргументы метода на null?
B>>Где логика? B>Логика в том что неверное значение и отсутствующее значение это не одно и тоже.
Отсутствующее значение, очевидно, неверно, поскольку приводит к исключительной ситуации. NPE в случае аргумента равного null хуже диагностирует проблему, чем IAE.
Re[5]: Проверяют ли в Java аргументы метода на null?
Здравствуйте, Jakop, Вы писали:
J>Здравствуйте, Blazkowicz, Вы писали:
J>Не вижу особого смысла вообще что-то проверять. ява выкинет исключение по нему будет ясно что случилось.
Во-первых может не выкинуть, если по каким то причинам управление не перейдёт в код, где это значение используется, но ошибка тем не менее останется. Сходу не приходит в голову реалистичный пример, вот пример идиотский, но код с подобным поведением встречается:
int strLengthSometimes(String str) {
if (System.currentTimeInMillis() % 1000 < 100) {
return str.length();
} else {
return -1;
}
}
Если передавать null, то код иногда будет работать, а иногда не будет. При этом контракт подразумевает, что null не должен передаваться вообще. Чем раньше словим ошибку, тем раньше её поправим.
Во-вторых стектрейс с NPE будет содержать только строку кода. В одной строке может быть несколько ссылок, которые могут выкинуть этот NPE. В этом случае просто не получится точно узнать причину.
В-третьих будет немножко дольше определять ошибку, если исходники менялись — вытягивать нужную ревизию и т.д. Из IllegalArgumentException: str is null всё понятно и без номера строки.
Здравствуйте, 0K, Вы писали:
0K>В C# обычно так написать считается ошибкой: нужно проверить аргументы на null и лично выбросить ArgumentNullException. В Java, как я понял, так не принято. Т.е. пусть система выбрасывает NullPointerException -- ничего страшного в этом нет. Правильно ли я понял?
за последние лет семь по ряду вопросов меня всё меньше волнует, как там "принято в Java". т.к. конкретные задачи и проблемы на моих проектах решать приходится нам, а не тем, кто "принимал во время создания Java в конце 90х".
поэтому я проверяю параметры явно сам и прошу того же самого от коллег.
теперь о том, что выбрасывать.
всё та же многолетняя практика показала, что единственно реально помогающим способом быстро понять, кто и где ошибся, что способствует быстрому исправлению реальной причины, является сочетание хороших trace-логов с говорящими строками в NPE/IAE, которые выбрасываются нашим кодом.
при этом философская разница между NPE / IAE для меня минимальна. в конце концов, код имеет полное право по факту проверки параметра выбросить NPE, если бы было выброшено NPE при отсутствии оной.
0K>Если одна из строк null -- должно выбрасываться исключение.
0K>В C# обычно так написать считается ошибкой: нужно проверить аргументы на null и лично выбросить ArgumentNullException. В Java, как я понял, так не принято. Т.е. пусть система выбрасывает NullPointerException -- ничего страшного в этом нет. Правильно ли я понял?
Обычно так делается. Это с любой точек зрения правильно.
Элементарные функции должны быть максимально быстрыми и неперегружеными киданием исключений.
ИМХО кидать так исключения бред, и если легаси код написан подобным образом, то понятно почему Жава такая тормозная
public int getLenght(String s1, String s2){
if ((s1 == null) || (s2==null))
return -1;
else
return s1.length() + s2.length();
}
Re[2]: Проверяют ли в Java аргументы метода на null?
Здравствуйте, rov63rus, Вы писали:
R>ИМХО кидать так исключения бред, и если легаси код написан подобным образом, то понятно почему Жава такая тормозная
R>
Бред это заменять исключения на код возврата. Видать тупые люди эти самые исключения придумали, видать в кодах возврата недостаточно хорошо разобрались.
Re[2]: Проверяют ли в Java аргументы метода на null?
DR>Есть еще встроенный механизм ассертов
DR>можно еще писать DR>assert s1!=null && s1!=null;
Я где то читал, что аргументы в публичных методах не рекомендуется обрамлять ассертами.
Кто нибудь может прокоментировать за и против этой рекомендации и данного примера?
Re[3]: Проверяют ли в Java аргументы метода на null?
Здравствуйте, Аноним, Вы писали:
А>Я где то читал, что аргументы в публичных методах не рекомендуется обрамлять ассертами.
Не то что они не рекомендуются. Они для этого просто не предназначены.
А>Кто нибудь может прокоментировать за и против этой рекомендации и данного примера?
Тю, ассерты отключаются простым ключиком командной строки запуска JVM. Таким образом вся логика, реализованная на них, идет лесом одним простым движением руки.
Re[3]: Проверяют ли в Java аргументы метода на null?
DR>>Есть еще встроенный механизм ассертов
DR>>можно еще писать DR>>assert s1!=null && s1!=null;
А>Я где то читал, что аргументы в публичных методах не рекомендуется обрамлять ассертами. А>Кто нибудь может прокоментировать за и против этой рекомендации и данного примера?
А что тут коментировать? Ассерты по умолчанию вырублены и не работают пока не укажешь ключ -ea при запуска жавамашины.
Re[3]: Проверяют ли в Java аргументы метода на null?
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, rov63rus, Вы писали:
R>>ИМХО кидать так исключения бред, и если легаси код написан подобным образом, то понятно почему Жава такая тормозная
R>>
B>Бред это заменять исключения на код возврата. Видать тупые люди эти самые исключения придумали, видать в кодах возврата недостаточно хорошо разобрались.
не люблю медленный код жрущий много памяти. Опыт создания и оптимизации игр под J2ME на моей стороне
Re[4]: Проверяют ли в Java аргументы метода на null?
Здравствуйте, rov63rus, Вы писали:
R>не люблю медленный код жрущий много памяти. Опыт создания и оптимизации игр под J2ME на моей стороне
Ага, давайте теперь ради убогости J2ME весь Java код писать процедурами и во всю пользоватся препроцессорами. Вы бы ещё на уровне байткода оптимизации посоветовали.
Re[7]: Проверяют ли в Java аргументы метода на null?
Здравствуйте, Baudolino, Вы писали:
B>Читал. Товарищ, за которого проголосовало на треть меньше народу, считает, что это "best practice". Но это не аргумент.
Точку зрения этого товарища также разделяет некто Джошуа Блох. Но за него там вообще никто не проголосовал, так что его мнение не считается.
Re[4]: Проверяют ли в Java аргументы метода на null?
Здравствуйте, rov63rus, Вы писали:
R>>>ИМХО кидать так исключения бред, и если легаси код написан подобным образом, то понятно почему Жава такая тормозная R>>>
B>>Бред это заменять исключения на код возврата. Видать тупые люди эти самые исключения придумали, видать в кодах возврата недостаточно хорошо разобрались.
R>не люблю медленный код жрущий много памяти. Опыт создания и оптимизации игр под J2ME на моей стороне
Предлагаешь в точке вызова проверять, а не вернул ли метод -1 вместо того, чтобы перед вызовом проверить оба аргумента на null?
Если уж говорить об оптимизации, то в данном случае надо писать код так, чтобы null'овые значения не появлялись. И оптимизировать надо не все подряд, а только узкие места. И уж точно не надо проецировать практики, используемые в J2ME, на всю яву. Или уж жечь по полной и следовать всем заморочкам JavaCard
Re[8]: Проверяют ли в Java аргументы метода на null?
D>Точку зрения этого товарища также разделяет некто Джошуа Блох. Но за него там вообще никто не проголосовал, так что его мнение не считается.
Ссылка на авторитета тоже плохой аргумент.
Re[9]: Проверяют ли в Java аргументы метода на null?
Здравствуйте, Baudolino, Вы писали:
D>>Точку зрения этого товарища также разделяет некто Джошуа Блох. Но за него там вообще никто не проголосовал, так что его мнение не считается. B>Ссылка на авторитета тоже плохой аргумент.
Это один из создателей языка и платформы. И он упоминает соглашение, по которому в таких случаях необходимо кидать NPE. В общем, это такая же ссылка на авторитета, как сослаться на Рудольфа Дизеля относительно устройства дизеля.
Даже если представить, что кидать IAE в этом случае логичнее, то это не стоит того, чтобы переписывать стандартные соглашения и пытаться весь мир заставить им следовать. Хотя, конечно, при неожидаемом null логичнее видеть NPE во всех случаях.
Re[5]: Проверяют ли в Java аргументы метода на null?
Здравствуйте, Donz, Вы писали:
D>Здравствуйте, rov63rus, Вы писали:
R>>>>ИМХО кидать так исключения бред, и если легаси код написан подобным образом, то понятно почему Жава такая тормозная R>>>>
B>>>Бред это заменять исключения на код возврата. Видать тупые люди эти самые исключения придумали, видать в кодах возврата недостаточно хорошо разобрались.
R>>не люблю медленный код жрущий много памяти. Опыт создания и оптимизации игр под J2ME на моей стороне
D>Предлагаешь в точке вызова проверять, а не вернул ли метод -1 вместо того, чтобы перед вызовом проверить оба аргумента на null? D>Если уж говорить об оптимизации, то в данном случае надо писать код так, чтобы null'овые значения не появлялись. И оптимизировать надо не все подряд, а только узкие места. И уж точно не надо проецировать практики, используемые в J2ME, на всю яву. Или уж жечь по полной и следовать всем заморочкам JavaCard
D>Если уж говорить об оптимизации, то в данном случае надо писать код так, чтобы null'овые значения не появлялись.
Вот это полностью поддерживаю. Я за безопасный код и эффективный код.