當我在 if 陳述句中設定除錯點并啟用“日志:斷點命中訊息”時,用于以下 Scala 代碼
object App1 {
def main(args: Array[String]): Unit = {
iftest()
}
def iftest(): Unit = {
val setA: Set[String] = Set("a", "b", "c");
var setB: Set[String] = Set("d", "e", "f")
if(setA.size > setB.size){ //here break point at line 8
println("bigger")
}
}
}
我在控制臺中得到以下輸出。問題是為什么這個斷點會被擊中兩次?
Breakpoint reached at com.eguller.App1$.iftest(App1.scala:8)
Breakpoint reached at com.eguller.App1$.iftest(App1.scala:8)
但是對于類似的 Java 代碼,斷點只命中一次。
Set<String> set1 = new HashSet<>();
set1.add("1");
set1.add("2");
Set<String> set2 = new HashSet<>();
set2.add("a");
set2.add("b");
if(set1.size() > set2.size()){ //here break point at line 8
System.out.println("size different");
}
我得到以下輸出
Breakpoint reached at com.eguller.JApp.main(JApp.java:8)
它是 Intellij 除錯器中的一個錯誤,還是 Scala 編程語言的一個特性?
IntelliJ IDEA 2021.3 Java - 11 Scala - 2.12.15
uj5u.com熱心網友回復:
這是 scalac 位元組碼生成的一個特點。出于某種原因,它會在回傳指令之前為除錯器生成一個額外的位置,并將其放在該行上。您可以在 IDE 中呼叫“顯示位元組碼”操作,并看到有 2LINENUMBER 8個條目:
// access flags 0x1
public iftest()V
L0
LINENUMBER 6 L0
GETSTATIC scala/Predef$.MODULE$ : Lscala/Predef$;
INVOKEVIRTUAL scala/Predef$.Set ()Lscala/collection/immutable/Set$;
GETSTATIC scala/runtime/ScalaRunTime$.MODULE$ : Lscala/runtime/ScalaRunTime$;
ICONST_3
ANEWARRAY java/lang/String
DUP
ICONST_0
LDC "a"
AASTORE
DUP
ICONST_1
LDC "b"
AASTORE
DUP
ICONST_2
LDC "c"
AASTORE
CHECKCAST [Ljava/lang/Object;
INVOKEVIRTUAL scala/runtime/ScalaRunTime$.wrapRefArray ([Ljava/lang/Object;)Lscala/collection/immutable/ArraySeq;
INVOKEVIRTUAL scala/collection/immutable/Set$.apply (Lscala/collection/immutable/Seq;)Ljava/lang/Object;
CHECKCAST scala/collection/immutable/Set
ASTORE 1
L1
LINENUMBER 7 L1
GETSTATIC scala/Predef$.MODULE$ : Lscala/Predef$;
INVOKEVIRTUAL scala/Predef$.Set ()Lscala/collection/immutable/Set$;
GETSTATIC scala/runtime/ScalaRunTime$.MODULE$ : Lscala/runtime/ScalaRunTime$;
ICONST_3
ANEWARRAY java/lang/String
DUP
ICONST_0
LDC "d"
AASTORE
DUP
ICONST_1
LDC "e"
AASTORE
DUP
ICONST_2
LDC "f"
AASTORE
CHECKCAST [Ljava/lang/Object;
INVOKEVIRTUAL scala/runtime/ScalaRunTime$.wrapRefArray ([Ljava/lang/Object;)Lscala/collection/immutable/ArraySeq;
INVOKEVIRTUAL scala/collection/immutable/Set$.apply (Lscala/collection/immutable/Seq;)Ljava/lang/Object;
CHECKCAST scala/collection/immutable/Set
ASTORE 2
L2
LINENUMBER 8 L2
ALOAD 1
INVOKEINTERFACE scala/collection/immutable/Set.size ()I (itf)
ALOAD 2
INVOKEINTERFACE scala/collection/immutable/Set.size ()I (itf)
IF_ICMPLE L3
L4
LINENUMBER 9 L4
GETSTATIC scala/Predef$.MODULE$ : Lscala/Predef$;
LDC "bigger"
INVOKEVIRTUAL scala/Predef$.println (Ljava/lang/Object;)V
GOTO L3
L3
LINENUMBER 8 L3
FRAME APPEND [scala/collection/immutable/Set scala/collection/immutable/Set]
RETURN
L5
LOCALVARIABLE setA Lscala/collection/immutable/Set; L1 L3 1
LOCALVARIABLE setB Lscala/collection/immutable/Set; L2 L3 2
LOCALVARIABLE this LApp1$; L0 L5 0
MAXSTACK = 6
MAXLOCALS = 3
Scala 3 編譯器沒有添加這個,斷點按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/378615.html
