💬
[Kotlin] @Throws の仕組み
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