对于具有静态方法的接口,Java 8 ClassFormatException,但仅在使用断言时

2023-12-25

我开始遇到 ClassFormatExceptions,我无法解释与静态方法的接口相关的问题。我将其精简为这个测试用例:

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);
    }
}

如果没有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 下。


首先,Eclipse 有自己的编译器,因此可能存在错误,而不是在javac.

现在,Juno 是一个旧版本,早于 Eclipse 对 Java 8 的支持,早期版本的 Java 根本不允许在接口中使用静态方法。这就是您的报告变得混乱的地方。

无论如何,您应该升级到 Luna,以便在 Eclipse 中与 Java 8 无缝协作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于具有静态方法的接口,Java 8 ClassFormatException,但仅在使用断言时 的相关文章

随机推荐