1. 程式人生 > >jdk 10.0.2 bug修復

jdk 10.0.2 bug修復

之前記錄過jdk9+版本的1個bug,某些情況下會導致方法執行二遍,今天早上開啟筆記本(mac),彈出一個框提示jdk升級10.0.2,順手點了一下,然後驗證了下該bug,發現居然fix掉了,推薦大家升級!

還是這段程式碼:

public class JavacEvalBug{
 
    private static String[] array = {""};
 
    static int test(){
        System.out.println("evaluated!");
        return 0;
    }
 
    public static void main(String[] args) {
        array[test()] += "a";
    }
 
}  

編譯執行後,只輸出了一次evaluated!,用工具檢視位元組碼:

javap -verbose JavacEvalBug 

(注:jdk 10.0.2 在mac上的安裝路徑為 /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home)

輸出如下(僅截取了片段):

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=4, locals=1, args_size=1
         0: getstatic     #5                  // Field array:[Ljava/lang/String;
         3: invokestatic  #6                  // Method test:()I
         6: dup2
         7: aaload
         8: invokedynamic #7,  0              // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String;
        13: aastore
        14: return
      LineNumberTable:
        line 11: 0
        line 12: 14  

  test:() I 這裡只調用了1次,這回可以放心使用jdk 10了。順便,附圖一張,jdk近年來更新節奏大提速,從下圖看,10.0.2這個版本到2018-12-16 就過期了(即:又得升級)