scala – 使用/不使用断言进行编译时的javap差异
不耐烦的
Scala第15章练习10:添加断言(n> = 0到一个阶乘方法.编译启用断言并验证factorial(-1)是否抛出异常.编译时没有断言.会发生什么?使用javap检查什么发生在断言电话上.
我的代码: object Test { def factorial(x: Int): Int = { assert(x >= 0,"Call to factorial must be >= 0!") x match { case 0 => 1 case x: Int => x * factorial(x - 1) } } def main(args: Array[String]): Unit = { factorial(-1) } } 我首先使用scalac编译,使用javap Test检查它,然后使用scalac -Xelide-below MAXIMUM再次编译并使用相同的命令进行检查 – 我似乎无法找到两者之间的差异. 我理解使用断言进行编译会在我尝试执行程序时抛出异常,而没有断言的编译会导致堆栈溢出错误,但我找不到javap中的区别… 解决方法
当我使用javap -v尝试此操作时,我在启用了断言的版本中找到以下行,但在另一行中没有:
20: invokevirtual #27; //Method scala/Predef$.assert:(ZLscala/Function0;)V ... 27: if_icmpne 34 30: iconst_1 31: goto 55 所以这当然看起来没问题. 问题可能是您要么不查看字节码(需要-c或-v标志为javap),要么更可能 – 您正在查看Test类的javap输出,而不是测试$.有关详细信息,请参阅例如Programming in Scala:
如果列出已编译的目录的内容,则会看到Test.class和Test $.class.使用javap -v Test $会显示后者,这是你会发现差异的地方. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |