Как генерируемый scala байт-код сбрасывает проверенное исключение? - PullRequest
5 голосов
/ 02 декабря 2010

Если возможно написать байт-код для метода, который должен выдавать проверяемое исключение?

Например, следующий класс Java не компилируется, если метод не объявляет, что выбрасывает проверенное исключение:

public class CheckedExceptionJava {
  public Class<?> testChecked(String s) throws ClassNotFoundException {
    return Class.forName(s);
  }
}

Хотя следующий эквивалент Scala имеет (поскольку Scala не имеет проверенных исключений):

class CheckedException { 
    def testChecked( s : String )  = Class.forName( s ) 
}

Даже если сгенерированный байт-код практически идентичен:

Compiled from "CheckedExceptionJava.java"
public class CheckedExceptionJava extends java.lang.Object{
public CheckedExceptionJava();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public java.lang.Class testChecked(java.lang.String)   throws java.lang.ClassNotFoundException;
  Code:
   0:   aload_1
   1:   invokestatic    #2; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
   4:   areturn

}

Compiled from "CheckedException.scala"
public class CheckedException extends java.lang.Object implements scala.ScalaObject{
public CheckedException();
  Code:
   0:   aload_0
   1:   invokespecial   #24; //Method java/lang/Object."<init>":()V
   4:   return

public java.lang.Class testChecked(java.lang.String);
  Code:
   0:   aload_1
   1:   invokestatic    #11; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
   4:   areturn

}

Вопрос: возможно ли (и как) сгенерировать байт-код, который не помечает, что он генерирует проверенное исключение, даже если код внутри этого метода не обрабатывает его?

1 Ответ

13 голосов
/ 02 декабря 2010

Simple.В то время как байт-код JVM включает в себя проверенные спецификации исключений для методов, верификатор байт-кода, который запускается перед выполнением какого-либо байт-кода, не проверяет, действительно ли методы соответствуют спецификациям исключений.Вы могли бы написать программу, которая бы взяла существующий байт-код JVM и удалила все спецификации исключений, и полученный байт-код был бы совершенно действительным и работал бы так же, как и оригинал (за исключением отражения).

...