|
|
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Class.forName(className) throws ClassNotFoundException ClassNotFoundException - checked а мы хотим сделать цикл который по названия классов в массиве грузит их На SO предлагают следующее клиентский код(самое удивительное, что не надо писать throws в функции): Код: java 1. 2. rethrowConsumer: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. throwAsUnchecked: Код: java 1. 2. 3. 4. Выглядит как какой-то хак. к чему кастим внутри throwAsUnchecked ? Объясните плиз как так и из checked получается unchecked ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 19:24 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
redwhite90Class.forName(className) throws ClassNotFoundException ClassNotFoundException - checked а мы хотим сделать цикл который по названия классов в массиве грузит их На SO предлагают следующее клиентский код(самое удивительное, что не надо писать throws в функции): Код: java 1. 2. rethrowConsumer: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. throwAsUnchecked: Код: java 1. 2. 3. 4. Выглядит как какой-то хак. к чему кастим внутри throwAsUnchecked ? Объясните плиз как так и из checked получается unchecked ? Ну как... При вызове У будет RuntimeException. Написать его прямо нельзя, поскольку тогда будет нормальное преобразование с проверкой. А E - без проверки (о чём "unchecked"). Да, хак. Работает. По сути- это очередная демонстрация кривости концепции checked exceptions. Используй Either . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 20:06 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 20:58 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Прикольно. Я это понимаю следующим образом. Код: java 1. 2. 3. 4. Вот эту часть кода вы пропустили, хотя она важна для понимания. Метод Consumer_WithExceptions#accept() объявляет, что он кидает нечто, что наследуется от Exception. Если этот метод где-то будет вызываться, то компилятор заставит нас написать обработку ошибки. Код: java 1. 2. 3. 4. Здесь Exception превращается в нечто, что наследуется от Throwable (т.е. буквально "любая ошибка": Error, Exception или RuntimeException). Каст нужен, потому что E и Exception - это не один и тот же тип, и если не написать каст, то компилятор попросить объявить Exception в перечне выбрасываемых ошибок (т.е. дописать throws E, Exception). Каст разрешен, потому что upper bound E - это Throwable, и приведение Exception -> Throwable корректно. Но при этом каст небезопасный, так как компилятор не может знать, к чему реально будет привязан E в рантайме. При этом в данном случае это и неважно, поскольку то что выбрасывается через throw, можно присвоить к чему-то только через catch(), и если тип не совпадет, то вместо ClassCastException catch просто не будет вызван, т.е. программа никак не может спровоцировать некорректное приведение типов. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Зная, что Consumer_WithExceptions#accept() кидает Exception, компилятор обязывает нас его как-то обработать. Перебросить мы его не можем, так как метод rethrowConsumer возвращает java.util.Consumer, у которого метод accept() уже не объявляет исключений. Т.е. единственный вариант это catch. Держим в уме, что помимо Exception любой метод может бросить RuntimeException или Error. Ни то, ни другое обработки не требует; при этом RuntimeException будет обработан в catch(Exception e), а Error вылетит, минуя обработку. Код: java 1. 2. 3. 4. rethrowConsumer возвращает java.util.Consumer, что и требуется для Stream#forEach. Код: java 1. Тип лямбды в данном контексте вычисляется компилятором как Consumer_WithExceptions<String, ClassNotFoundException>, и поскольку метод rethrowConsumer компилируется, то это с т.з. компилятора значит, что ClassNotFoundException в нем корректно обрабатывается (и мы действительно видели, что внутри есть try{} catch(Exception), который перехватит ClassNotFoundException). -- С моей точки зрения, такой код лучше не писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 22:28 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Andrei T, Код: java 1. принимает уже консумера который ничего не бросает Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Пусть Код: java 1. это черный ящик Все чекед и нечекед из него мы ловим Код: java 1. 2. 3. Значит этот метод бросает то, что бросает Код: java 1. Код: java 1. 2. 3. 4. Этот метод бросает некого наследника Throwable почему мы не должны проверять его в вызывающем коде? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 01:01 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 01:04 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
redwhite90, Тут работает автовыведение типов. Наверно, подразумевается, что если ошибка объявлена как некий наследник Throwable, то это может быть как checked, так и unchecked exception, и поэтому заставлять обрабатывать такую ошибку не следует. Код: java 1. E выводится как RuntimeException, о чем выше написал Alexey Tomin. Если написать явно: Код: java 1. То потребуется написать обработку ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 01:14 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
redwhite90Usmanredwhite90, Прокачиваем Stream API, или нужно больше сахара А что тут в этой ссылке по теме?Толстый намек на то, что нужно extend-ить Stream и перегружать методы (ну, и скорее всего functional тоже). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 04:42 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Andrei Tredwhite90, Тут работает автовыведение типов. Наверно, подразумевается, что если ошибка объявлена как некий наследник Throwable, то это может быть как checked, так и unchecked exception, и поэтому заставлять обрабатывать такую ошибку не следует. Код: java 1. E выводится как RuntimeException, о чем выше написал Alexey Tomin. Если написать явно: Код: java 1. То потребуется написать обработку ошибки. То, что получается рантайм я и так вижу. Почему он получается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 10:47 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
redwhite90Andrei Tredwhite90, Тут работает автовыведение типов. Наверно, подразумевается, что если ошибка объявлена как некий наследник Throwable, то это может быть как checked, так и unchecked exception, и поэтому заставлять обрабатывать такую ошибку не следует. Код: java 1. E выводится как RuntimeException, о чем выше написал Alexey Tomin. Если написать явно: Код: java 1. То потребуется написать обработку ошибки. То, что получается рантайм я и так вижу. Почему он получается? http://docs.oracle.com/javase/specs/jls/se8/html/jls-18.html#jls-18.1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 11:12 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Andrei T, Спасибо, прямо вот всё понятно стало. от души просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 11:41 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
redwhite90Спасибо, прямо вот всё понятно стало. от души просто. Вот тут с объяснениями: https://stackoverflow.com/a/31316879 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 11:54 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Так писать нельзя Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. а вот так можно: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. То есть фишка в каком-то особенном выводе типов внутри throwAsUnchecked Чего-то пока не могу понять. Выглядит как какая-то бага ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 12:54 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
redwhite90Чего-то пока не могу понять.это категория RuntimeException-ов, они считаются unchecked - не нужно их перечислять после ключевого слова throws (это касается все исключения, которые были наследованы от RuntimeException)redwhite90Выглядит как какая-то багафича (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 13:10 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Usmanredwhite90Чего-то пока не могу понять.это категория RuntimeException-ов, они считаются unchecked - не нужно их перечислять после ключевого слова throws Конечно это я знаю... не понятно как получилось так, что обошли обязанность прокидывать Exception ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 13:20 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
redwhite90не понятно как получилось так, что обошли обязанность прокидывать Exceptionзадумка такая https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html The next question might be: "If it's so good to document a method's API, including the exceptions it can throw, why not specify runtime exceptions too?" Runtime exceptions represent problems that are the result of a programming problem, and as such, the API client code cannot reasonably be expected to recover from them or to handle them in any way. Such problems include arithmetic exceptions, such as dividing by zero; pointer exceptions, such as trying to access an object through a null reference; and indexing exceptions, such as attempting to access an array element through an index that is too large or too small. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 13:37 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Usmanredwhite90не понятно как получилось так, что обошли обязанность прокидывать Exceptionзадумка такая https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html The next question might be: "If it's so good to document a method's API, including the exceptions it can throw, why not specify runtime exceptions too?" Runtime exceptions represent problems that are the result of a programming problem, and as such, the API client code cannot reasonably be expected to recover from them or to handle them in any way. Such problems include arithmetic exceptions, such as dividing by zero; pointer exceptions, such as trying to access an object through a null reference; and indexing exceptions, such as attempting to access an array element through an index that is too large or too small. Что Вы этим хотите сказать? да, мы обязаны декларировать Checked исключения, а все остальные не обязаны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 16:40 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
redwhite90да, мы обязаны декларировать Checked исключения, а все остальные не обязаны.это выглядит как бага? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 16:48 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Usmanredwhite90да, мы обязаны декларировать Checked исключения, а все остальные не обязаны.это выглядит как бага? Нет, багой выглядит то, что после хитрого каста генерика мы можем выплюнуть чекед эксепшн и не декларировать его нигде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 16:54 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
redwhite90Usmanпропущено... это выглядит как бага? Нет, багой выглядит то, что после хитрого каста генерика мы можем выплюнуть чекед эксепшн и не декларировать его нигде https://dzone.com/articles/throw-checked-exceptions Побочный эффект "стирания" generic'а: - <E extends Throwable> трактуется как <RuntimeException> - Кастинг t в RuntimeException не вызывает ClassCastException - Стирание происходит во время компиляции, а также стирается сам кастинг и остается оригинальное исключение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 18:48 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Usmanredwhite90пропущено... Нет, багой выглядит то, что после хитрого каста генерика мы можем выплюнуть чекед эксепшн и не декларировать его нигде https://dzone.com/articles/throw-checked-exceptions Побочный эффект "стирания" generic'а: - <E extends Throwable> трактуется как <RuntimeException> - Кастинг t в RuntimeException не вызывает ClassCastException - Стирание происходит во время компиляции, а также стирается сам кастинг и остается оригинальное исключение На самом деле там остается не оригинальное исключение, а upper bound дженерика, т.е. Throwable: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Для сравнения байткод Consumer_WithExceptions#accept(): Код: java 1. 2. 3. 4. 5. 6. То что <E extends Throwable> трактуется как <RuntimeException>, это, как мне кажется, не побочный, а вполне намеренный эффект (не удивлюсь если где-нибудь в JLS это указано как special case). Логика по-видимому такая, что заставлять писать try{} catch (Throwable e){} некошерно, т.к. тогда код будет ловить все подряд, включая то, что ловить не следует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 19:06 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Andrei TНа самом деле там остается не оригинальное исключение, а upper bound дженерика, т.е. Throwable:Все же остается оригинальное исключение ( не вложен и не запакован): Код: java 1. 2. 3. 4. 5. Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2017, 05:22 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
Usman, я думал ты про типы после компиляции :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2017, 09:13 |
|
||
|
Как работает трюк с пробросом checked exceptions для стримов с точки зрения языка?
|
|||
|---|---|---|---|
|
#18+
http://en.newinstance.it/2008/11/17/throwing-undeclared-checked-exceptions/ Вот тут список таких хаков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2017, 12:08 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39515407&tid=2122609]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 204ms |
| total: | 393ms |

| 0 / 0 |
