Size: a a a

2021 November 07

SK

Stepan Kladikov in Kotlin JVM
Я так понимаю, что оно как раз никаких врапов/т.п. не делает
источник

SK

Stepan Kladikov in Kotlin JVM
Там какие-то изменения на уровне компилятора, но это пока вышло за границы моей компетенции
источник

SK

Stepan Kladikov in Kotlin JVM
Всё, что я понял - надо эту фичу вручную удалять и везде прокидывать/обрабатывать исключения
источник

VP

Vladimir Petrakovich in Kotlin JVM
На уровне отсутствия checked exceptions в языке
источник

VP

Vladimir Petrakovich in Kotlin JVM
То есть любой код, скомпилированный kotlinc, может кидать checked exceptions без их объявления.
Подробнее тут
источник

VP

Vladimir Petrakovich in Kotlin JVM
По сути весь ваш код @SneakyThrows
источник

SK

Stepan Kladikov in Kotlin JVM
А как это связано с вопросом, на каком уровне работает SneakyThrows?
источник

SK

Stepan Kladikov in Kotlin JVM
А то получается ответ на вопрос "как переписать код без SneakyThrows" - написать его на kotlin?)
источник

VP

Vladimir Petrakovich in Kotlin JVM
На каком уровне он "работает" в котлине, или какими костылями его запихали в javac?
На первый вопрос я ответил, а если это не то, что вы имели в виду, уточните.
источник

VP

Vladimir Petrakovich in Kotlin JVM
А на этот вопрос ответ простой: обмануть javac через unchecked cast
источник

ПФ

Паша Финкельштейн... in Kotlin JVM
Второй вопрос - по сути любой эксепшн неявно надо кастить к рантайм эксепшну
источник

VP

Vladimir Petrakovich in Kotlin JVM
Главное кастить его так, чтобы каста в байткоде не было)
источник

SK

Stepan Kladikov in Kotlin JVM
Ну да, понятно, что можно сгенерировать код, который обернет exception в непроверяемое, но ломбок этого не делает
источник

VP

Vladimir Petrakovich in Kotlin JVM
Вы не понимаете, не надо ничего оборачивать, надо по-хитрому кидать исходное исключение.
Это и делает SneakyThrows из ломбока.
источник

SK

Stepan Kladikov in Kotlin JVM
Изначально Богдан сказал, что ломбок генерирует kotlin-подобный код и я спросил, какой, потому что в документации написано, что он как раз этого не делает, а просто каким-то образом "обманывает" компилятор
Иными словами, при деломбоке этой фичи есть два варианта: сделать обёртку с каким-нибудь рантайм исключением, либо честно прокидывать все исключения в сигнатурах методов

Но и это не всегда возможно (например, если аннотация была на override методе - его сигнатуру не изменить и придется честно исключение ручками обрабатывать)
источник

SK

Stepan Kladikov in Kotlin JVM
Подскажите, пожалуйста, как, потому что я этого не понимаю
источник

VP

Vladimir Petrakovich in Kotlin JVM
Небольшой поиск по StackOverflow выдаст вам что-то подобное:
public static <E extends Throwable> void sneakyThrow(Throwable e) throws E {
   throw (E) e;
}
источник

SK

Stepan Kladikov in Kotlin JVM
Когда доберусь до ноутбука попробую это использовать, спасибо
источник

AE

Alexandr Emelyanov in Kotlin JVM
Его можно использовать лишь на всякие encoding exception, которые не возникнут)
источник

ПФ

Паша Финкельштейн... in Kotlin JVM
Он как раз кастит
источник