标签是否是 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 的示例中A,B标签和标签都与同一个 while 循环语句相关,因此不应触发编译时错误。
添加:
Java 中带标签的while/do/for 语句不是 while/do/for 语句吗?
Java是语言,JRE是运行环境,JDK是开发工具?JLS 是说 JRE 必须执行 x,y,z 的规范,因此使 Java 成为什么?这些观点是否正确,如果不正确,有人可以启发我吗?
是否有一些我们认为是 Java 但不是的东西?我想我听说过关于 Android 的事情——是真的吗?
为什么它会因下面显示的错误而失败?我不确定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) 通过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)
代码正在编译中.但在这两种情况下,变量定义都在初始化块之后.这背后的秘密是什么?
任何正文可以告诉为什么以下代码的输出是"空"?构建复杂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) 我一直认为类加载和类初始化是同义的,并且当初始化/加载的类以第一次以某种方式使用时,通常按需发生.但是现在我从这个答案中得知关于最终静态文件的行为,它保存了我认为错误的编译时常量.
请注意以下内容,很明显类加载 和初始化是两种不同的机制.
作为一个侧面,请注意类加载和类初始化之间的区别:只有后者的出现由JLS精确指定.类加载可以随时发生.
但有人可以解释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 8 的以下类Optional:
final class Main {\n public static void main(final String[] args) {\n System.out.println(Optional.of("test").get());\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n如果我使用针对 Java 7 字节码的 Java 8 编译器编译代码:
\njavac -target 1.7 -source 1.7 Main.java\nRun Code Online (Sandbox Code Playgroud)\n当我使用 Java 7 JVM 运行时,会按预期main抛出一个NoClassDefFoundError包装 a 。ClassNotFoundExceptionjava.util.Optional
Optional但是,如果我在使用该类之前(通过反射)检查该类的可用性:
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) 我想知道使用如下构造是否可靠:
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 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)