💬

[Kotlin] @Throws の仕組み

2022/03/09に公開

Kotlin Default arguments の仕組み

つまり

  • @Throws(FooException::class) を fun につけないと、バイトコードレベルでも throws が記載されない。
  • athrow 命令を呼ぶメソッドで、throws 記載しなくても許されることを知った。
  • throws 句を書かないと怒られるのは javac が諭してくれているだけで実行時には問題にならない様子。

実験コード(java で throws のバイトコード)

class Main{
  static void throwingMethod() throws Exception{
    throw new Exception();
  }
}
$ javac Main.java
$ javap -p -v -s -constants -c Main.class
(省略)
static void throwingMethod() throws java.lang.Exception; // 注目
  descriptor: ()V
  flags: (0x0008) ACC_STATIC
  Code:
    stack=2, locals=0, args_size=0
       0: new           #7                  // class java/lang/Exception
       3: dup
       4: invokespecial #9                  // Method java/lang/Exception."<init>":()V
       7: athrow
    LineNumberTable:
      line 3: 0
  Exceptions: // 注目
    throws java.lang.Exception
(省略)

実験コード(kotlin で@Throws をつけない場合、つける場合)

fun throwingMethod(){
  throw Exception()
}

@Throws(Exception::class)
fun throwingMethodAnnotated(){
  throw Exception()
}
$ kotlinc ./Main.kt -include-runtime -d ./Kotlin.jar; unzip -o Kotlin.jar; javap -p -v -s -constants -c MainKt.class
(省略)
public static final void throwingMethod(); // throws記載がない
  descriptor: ()V
  flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
  Code:
    stack=2, locals=0, args_size=0
       0: new           #8                  // class java/lang/Exception
       3: dup
       4: invokespecial #11                 // Method java/lang/Exception."<init>":()V
       7: athrow
    LineNumberTable:
      line 2: 0

public static final void throwingMethodAnnotated() throws java.lang.Exception;// throws記載がある
  descriptor: ()V
  flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
  Code:
    stack=2, locals=0, args_size=0
       0: new           #8                  // class java/lang/Exception
       3: dup
       4: invokespecial #11                 // Method java/lang/Exception."<init>":()V
       7: athrow
    LineNumberTable:
      line 7: 0
  Exceptions:// throws記載がある
    throws java.lang.Exception
(省略)

Discussion