标签: jls

标签是否是 Java 语句?

标签是否是 Java 语句,如果标签是语句,它在 Java 语言规范中的何处定义为语句?

我的问题与 Jan Lahoda 在我发送给 Oracle 的错误报告中的以下回复有关。我无法在那里讨论它,因为我无法在 OpenJDK Jira 中获得一个帐户。

https://bugs.openjdk.java.net/browse/JDK-8211052

例如: A: B: while (true) continue A;应用“continue”的语句不是“ while (true) continue A;”,而是“ B: while (true) continue A;”,规范要求continue的目标是while/do/for语句,这里没有实现。因此,编译时错误。

我认为 Java 中的标签不是语句,在 Jan 的示例中AB标签和标签都与同一个 while 循环语句相关,因此不应触发编译时错误。

添加:

Java 中带标签的while/do/for 语句不是 while/do/for 语句吗?

java jls

4
推荐指数
1
解决办法
183
查看次数

JLS、Java 和相关技术之间是什么关系?

Java是语言,JRE是运行环境,JDK是开发工具?JLS 是说 JRE 必须执行 x,y,z 的规范,因此使 Java 成为什么?这些观点是否正确,如果不正确,有人可以启发我吗?

是否有一些我们认为是 Java 但不是的东西?我想我听说过关于 Android 的事情——是真的吗?

java jls

3
推荐指数
1
解决办法
2286
查看次数

调用静态方法时"变量xxx可能尚未初始化",该方法返回相同类型的变量和类型本身的相同名称

为什么它会因下面显示的错误而失败?我不确定JLS在哪里寻找限制做这样的事情.

public class A {

    static A foo() {
        return null;
    }

    public static void main(String[] args) {
        A A = A.foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

编译时出错

A.java:14: error: variable A might not have been initialized
        A A = A.foo();
              ^
1 error
Run Code Online (Sandbox Code Playgroud)

java jls

3
推荐指数
1
解决办法
737
查看次数

Java静态初始化块上的奇怪代码

通过JLS 8.3.2.3时,我无法理解以下代码.

class Z {
static { i = j + 2; }
static int i, j;
static { j = 4; }
}
Run Code Online (Sandbox Code Playgroud)

代码导致错误 Cannot reference a field before it is defined

但是,如果我将代码更改为

class Z {
static { i = 2; }
static int i, j;
static { j = 4; }
}
Run Code Online (Sandbox Code Playgroud)

代码正在编译中.但在这两种情况下,变量定义都在初始化块之后.这背后的秘密是什么?

java static initializer jls

3
推荐指数
1
解决办法
174
查看次数

JVM如何启动超类和子类中的字段?

任何正文可以告诉为什么以下代码的输出是"空"?构建复杂Object并将细节委托给子类的最佳方法是什么?


package com.test;

public class ClassA {

    ClassA() {
        initHeader();
        initBody();
        initFooter();
    }

    void initHeader() {}

    void initBody() {}

    void initFooter() {}

    public static void main(String[] args) {
        ClassB a = new ClassB();
        System.out.println(a.obj);
    }
}

class ClassB extends ClassA {

    public Object obj = null;

    ClassB() {
        super();
    }

    void initHeader() {
        obj = new Object();
    }

}


Run Code Online (Sandbox Code Playgroud)

java jvm jls

3
推荐指数
1
解决办法
113
查看次数

类加载与类初始化

我一直认为类加载和类初始化是同义的,并且当初始化/加载的类以第一次某种方式使用时,通常按需发生.但是现在我从这个答案中得知关于最终静态文件的行为,它保存了我认为错误的编译时常量.

请注意以下内容,很明显类加载初始化是两种不同的机制.

作为一个侧面,请注意类加载和类初始化之间的区别:只有后者的出现由JLS精确指定.类加载可以随时发生.

但有人可以解释Java语言中类加载和类初始化之间的区别.通常直觉说初始化应始终先加载,但我完全错了.可以在没有加载类的情况下进行初始化吗?

java jvm jls

3
推荐指数
1
解决办法
1708
查看次数

Java - 我们可以从初始化程序中返回吗?

为什么静态初始值设定项不能有多个退出点?Java语言规范是否如此陈述?

尝试编译代码时:

class HelloWorldApp {
    static {
        if(1 > 2)
          return;
        System.out.println("static"); 
    }

    public static void main(String[] args) {
        System.out.println("Hello World!"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器打印出错误: return outside method

与Java拆卸javap表明,static是一种无效的方法,所以这将是可能的,从理论上说,创建一个字节码,将有多个"返回"?

java jls

3
推荐指数
1
解决办法
122
查看次数

JVM/JLS 中是否指定永远不会加载未使用的代码路径中的类?

给出使用 Java 8 的以下类Optional

\n
final class Main {\n    public static void main(final String[] args) {\n        System.out.println(Optional.of("test").get());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果我使用针对 Java 7 字节码的 Java 8 编译器编译代码:

\n
javac -target 1.7 -source 1.7 Main.java\n
Run Code Online (Sandbox Code Playgroud)\n

当我使用 Java 7 JVM 运行时,会按预期main抛出一个NoClassDefFoundError包装 a 。ClassNotFoundExceptionjava.util.Optional

\n

Optional但是,如果我在使用该类之前(通过反射)检查该类的可用性:

\n
final class Main {\n    public static void main(final String[] args) {\n        if (isOptionalAvailable()) {\n            System.out.println(Optional.of("test").get());\n        } else {\n            System.out.println("Optional not found.");\n        }\n    }\n\n    private static boolean isOptionalAvailable() …
Run Code Online (Sandbox Code Playgroud)

java jvm jls

3
推荐指数
1
解决办法
174
查看次数

JLS中是否有关于执行静态初始化块的顺序的保证?

我想知道使用如下构造是否可靠:

private static final Map<String, String> engMessages;
private static final Map<String, String> rusMessages;

static {
    engMessages = new HashMap<String, String> () {{
        put ("msgname", "value");
    }};
    rusMessages = new HashMap<String, String> () {{
        put ("msgname", "????????");
    }};
}

private static Map<String, String> msgSource;

static {
    msgSource = engMessages;
}

public static String msg (String msgName) {
    return msgSource.get (msgName);
}
Run Code Online (Sandbox Code Playgroud)

有可能我会得到NullPointerException因为msgSource初始化块之前会执行初始化块engMessages吗?

(关于为什么我不在msgSource初始化结束时进行初始化.块:只是味道问题;如果描述的结构不可靠,我会这样做)

java static-initialization jls

2
推荐指数
1
解决办法
354
查看次数

意图在文本块中的处理方式(Java 13)

我刚刚尝试了Java 13中的新文本块功能,但遇到了一个小问题。

我已经从Jaxcenter阅读了这篇文章

右三引号将影响格式。

String query = """
            select firstName,
            lastName,
            email
            from User
            where id= ?
        """;

System.out.println("SQL or JPL like query string :\n" + query);
Run Code Online (Sandbox Code Playgroud)

上面的格式效果很好。为了与结束定界符(“”“)对齐,多行字符串在每行之前保留空格。

但是,当我尝试比较以下两个文本块字符串时,它们在输出控制台中的格式相同,但是即使在之后也不相等stripIntent

String hello = """
    Hello,
    Java 13
    """;

String hello2 = """
    Hello,
    Java 13
""";

System.out.println("Hello1:\n" + hello);
System.out.println("Hello2:\n" + hello);

System.out.println("hello is equals hello2:" + hello.equals(hello2));

System.out.println("hello is equals hello2 after stripIndent():" + hello.stripIndent().equals(hello2.stripIndent()));
Run Code Online (Sandbox Code Playgroud)

输出控制台类似于:

String query = """
            select firstName,
            lastName,
            email …
Run Code Online (Sandbox Code Playgroud)

java string jls java-13

2
推荐指数
1
解决办法
137
查看次数

标签 统计

java ×10

jls ×10

jvm ×3

initializer ×1

java-13 ×1

static ×1

static-initialization ×1

string ×1