Почему в Java можно кидать что угодно?

В Java теоретически можно выбросить только Throwables.

Это разрешено языком и проверяется во время загрузки класса. Но если вы отключите проверку класса

java -Xverify:none -cp . BadClassThatCompiles

затем вы можете запустить класс, который генерирует любой класс (не производный от Throwable) (пример)

Почему?

Почему он разработан таким образом.. имеется в виду виртуальная машина, которая позволяет бросать объекты и верификатор, который должен отфильтровывать неправильный код. Как будто какой-то код может быть неправильным. Это не код, это дизайн!

Почему?


person Johanes Matian    schedule 04.03.2013    source источник
comment
Что почему ? Почему отключение верификатора позволяет делать странные вещи?   -  person Denys Séguret    schedule 04.03.2013
comment
почему JVM позволяет бросать объекты?!   -  person Johanes Matian    schedule 04.03.2013
comment
@dystroy — позволяет загружать файлы байт-кода, нарушающие различные правила, предназначенные для защиты JVM от повреждения; например возврат объекта из метода, который не соответствует ожидаемому типу возвращаемого значения. Это как жонглировать заряженными пистолетами... очень плохая идея.   -  person Stephen C    schedule 05.03.2013


Ответы (1)


Почему он разработан таким образом.. имеется в виду виртуальная машина, которая позволяет выбрасывать объекты и верификатор, который должен отфильтровывать неправильный код. Как будто какой-то код может быть неправильным. Это не код, это дизайн!

Почему?

Просто потому, что дизайн работает практически со всех точек зрения.

Ну какая может быть альтернатива?

Я предполагаю, что вам нужно было бы иметь особый вид вещей, которые НЕ были экземплярами классов, которые были разработаны с единственной целью - быть брошенными.

Это потребует:

  • новый синтаксис для определения этих исключений, не являющихся объектами
  • совершенно новый набор правил ввода для обработки этих не-объектов (например, они не могут быть совместимыми с присваиванием Object...)
  • и так далее.

В конце концов, язык Java будет более сложным и трудным для программиста. И с какой целью? Чтобы немного упростить задачу верификатору?

Извините, но если довести до логического завершения, то эта идея никуда не годится.


И, честно говоря, какая разница, можно ли сломать JVM, отключив верификатор. Это как жаловаться, что можно застрелиться, если жонглировать заряженным пистолетом.

person Stephen C    schedule 04.03.2013
comment
Почему бы просто не разрешить бросать что-либо в язык? Все это похоже на плохой дизайн / несоответствие требованиям... - person Johanes Matian; 04.03.2013
comment
@JohanesMatian Я думаю, если вы возьмете любой язык, я найду много хаков и разных обходных путей. Не бывает безупречных платформ и языков. - person Mikita Belahlazau; 04.03.2013
comment
@StephenC - вопрос: почему. Это очень конструктивно. - person Johanes Matian; 05.03.2013
comment
Как и было предложено, я очистил ветку комментариев (или, по крайней мере, мою ее часть). - person Stephen C; 05.03.2013