2014-09-10 57 views
3

我開始獲取ClassFormatExceptions,我無法解釋與靜態方法有關的接口。我修剪它到這個測試案例:Java 8 ClassFormatException用於靜態方法的接口,但僅當使用斷言時

public interface ModifierTest 
{ 
    public static final int DELTA = 10; 

    public static int increment(int value) 
    { 
     assert value > 0; // Problem line 
     return value + DELTA; 
    } 
} 

public class ModifierExec 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(ModifierTest.class); 
    } 
} 

沒有assertion在increment()方法,一切都很好。但隨着斷言,我會在運行時異常(編譯罰款):

Exception in thread "main" java.lang.ClassFormatError: Illegal field modifiers in class ModifierTest: 0x1018 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(Unknown Source) 
    at java.security.SecureClassLoader.defineClass(Unknown Source) 
    at java.net.URLClassLoader.defineClass(Unknown Source) 
    at java.net.URLClassLoader.access$100(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at com.c4.camgen.ModifierExec.main(ModifierExec.java:7) 

這是很容易一輪工作,但我很好奇,這是否是在Java或糾正錯誤(如果奇怪)的行爲。我無法找到任何影響字段修飾符的斷言的引用。

誰能告訴我發生了什麼事?在Eclipse Kepler中運行,在jdk 1.8.0_20下運行。

+0

這將是有趣的javap該類,看看有什麼。我猜* * assert *會生成一些隱藏的字段信息,這就是扼殺驗證者。 – 2014-09-10 18:11:26

+0

好想法。多年來沒有使用過javap。 Eclipse將「static final boolean $ assertionsDisabled」添加到類中。標準的javac沒有,所以我猜這將通過Maven構建運行良好。 – JonMoore 2014-09-10 19:51:42

回答

3

首先,Eclipse有它自己的編譯器,所以可能存在一個bug,而不是javac

現在,Juno是一箇舊版本,它早於Eclipse對Java 8的支持,並且早期版本的Java在接口中根本不允許使用靜態方法。這是你的報告混亂的地方。

無論如何,您應該升級到Luna以在Eclipse中與Java 8無縫協作。

+0

道歉 - 家庭和工作環境混淆。這是開普勒,而不是朱諾。我改變了這個問題。 – JonMoore 2014-09-10 19:50:25

+0

有機會升級到月神,問題就消失了。 – JonMoore 2014-09-20 14:08:08