metaclass: (дзедline)
metaclass ([personal profile] metaclass) wrote2013-03-21 11:25 am
Entry tags:

java try parse integer

А почему в java нету готовых методов, которые бы позволяли парсить числа, не кидая исключений?
Т.е. возвращали бы true+число, либо false, типа как int.TryParse в дотнете.

[identity profile] vp.livejournal.com 2013-03-21 09:57 am (UTC)(link)
Так мы дойдем, что проверка if() при не выполнении условия тоже будет бросать исключения вместо того, чтобы ветвиться.

[identity profile] kzn.livejournal.com 2013-03-21 10:23 am (UTC)(link)
Не надо преувеличивать :) Скажем isInteger() исключений бросать не должна.

Опять же, что плохого в исключениях?

[identity profile] vp.livejournal.com 2013-03-21 10:24 am (UTC)(link)
Есть мнение, что исключение - это исключительная ситуация. По определению здесь нет факта исключительной ситуации.

[identity profile] kzn.livejournal.com 2013-03-21 10:26 am (UTC)(link)
Каков критерий исключительной ситуации?
Edited 2013-03-21 10:27 (UTC)

[identity profile] vp.livejournal.com 2013-03-21 10:30 am (UTC)(link)
Ситуация, когда нормальная работа приложения либо модуля не может быть продолжена обычным образом, и вам необходимо вернуться, возможно, на несколько уровней вложенности в первоначальное состояние, передав наверх информацию о ситуации.

[identity profile] kzn.livejournal.com 2013-03-21 10:36 am (UTC)(link)
Ну а чем это не подходит к ситуации, когда мы ожидаем распарсит число, а не получается? Тут тоже возможно нужно передать информацию на уровень выше?

Чем принципиально это отличается от IOException?

[identity profile] vp.livejournal.com 2013-03-21 10:38 am (UTC)(link)
А не факт, что IOException - это правильное архитектурное решение. У нормальных людей эти операции возвращают результат операции, число там записанных байт и т.п. Там исключение - как корове седло.

[identity profile] kzn.livejournal.com 2013-03-21 10:39 am (UTC)(link)
Ну ок. А какое труъ исключение?

[identity profile] vp.livejournal.com 2013-03-21 10:42 am (UTC)(link)
Тру исключение то, которое спроектировано для выхода на определенный уровень обработки наверх.
То есть правильно было бы иметь по 2 версии функций, с исключениями и без них.
Просто использование исключений вместо кодов возврата приводит к тому, что 50 строчек линейного рабочего кода, например, для работы с файлом, превращаются в гору try блоков, которые могут быть не нужны.

[identity profile] kzn.livejournal.com 2013-03-21 10:56 am (UTC)(link)
Ну почему же? Что-то пошло не так при обработке файла? IOException и обрабатывать его на нужном уровне. Код вполне линейным получается.

В жабе конечно есть Checked Exceptions, но при правильном использовании вполне полезны.

[identity profile] vp.livejournal.com 2013-03-21 10:58 am (UTC)(link)
правильнее, мне кажется, было бы все-таки поиметь на месте код возврата и если нужно - бросить исключение. Потому что чаще это при таких операциях не сильно нужно.
Сделать из кода возврата исключение пишется лаконичнее, чем сделать код возврата из исключения :)

[identity profile] sil-e-nt.livejournal.com 2013-03-22 07:50 am (UTC)(link)
Ребе. Вот смотрите, решила индустрия вас послушать и наклепала дублирующих функций с кодами возврата. Хомячки обрадовались (это ж не надо теперь эти долбаные исключения обрабатывать) и начали их использовать. А принуждения к верификации кода возврата -- нету! Нету, блять, ващще! Кроме вменяемого тимлида, который будет каждый день проверять выхлоп и все фиксы и тэпэ и тэдэ.

А теперь представьте во что превратятся либы через пару лет. Как вы будете материться на то, что "какого хера оно продолжает\дохнет\подставьте сами без какой либо инфы?".

[identity profile] metaclass.livejournal.com 2013-03-21 10:30 am (UTC)(link)
Очень простой.
Если работу можно продолжать - исключение кидать не принято.
Исключения - для случаев, когда надо свалится в корень исполняемого потока (main loop или там обработчик выдающий 500 в веб-сервисе).
Делать логику на исключениях - очень нехорошо, но конкретно в данном случае жаба вынуждает это делать.

[identity profile] kzn.livejournal.com 2013-03-21 10:54 am (UTC)(link)
Это крайность имхо.

Исключение кидаются когда произошло нечто неожиданное с точки зрения разработчика.

parseInt() ожидает увидеть число. А получило. - вполне неожиданное событие.

Ожидали прочитать из файла, а он закончился - тоже.

Но и то, и другое можно сделать на статусах, как C.

[identity profile] metaclass.livejournal.com 2013-03-21 10:29 am (UTC)(link)
с if часть алгоритмов сильно короче и нагляднее. Ну, еще насчет производительности вопрос сложный.

[identity profile] kzn.livejournal.com 2013-03-21 10:38 am (UTC)(link)
Да. С этим согласен. Сам переписывал парсера, который не проверял границы, а кидал Out Of Bounds. Стало короче и даже быстрее.

Но вот с числами.. можно конечно сделать Integer Integer.parseInt() и возвращать null если не удалось распарсить.

[identity profile] henu3detb.livejournal.com 2013-03-21 11:36 am (UTC)(link)
Потом этот налл удетит по веб-сервису на N удаленных систем. Там сохранится в базах, потечет по бизнес-процессам и через пол года на другом континенте начнет вываливаться NPE. Нал он такой, да. Как и любители нала.

[identity profile] kzn.livejournal.com 2013-03-21 11:39 am (UTC)(link)
Ну ногу-то практически всегда отстрелить можно. Особенно при остром желании.

[identity profile] henu3detb.livejournal.com 2013-03-21 11:49 am (UTC)(link)
Про острое желание я ничего не говорил. А про случайные ситуации - говорил. И от таких ситуаций взрослые люди стараются себя страховать. Предохранители делают на приборах или эксепшны в коде. От всех несчастных случаев это не застрахует, но это не повод расслабляться и рассказывать про отстреленную ногу, случайность, карму, фазы луны и прочую ересь.

[identity profile] kzn.livejournal.com 2013-03-21 11:59 am (UTC)(link)
Ну так и говорю, что то, что parseInt() кидает исключение - вполне нормально.

На грабли всегда наступить можно.