问题标签 [jls]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java中是否保证从左到右的操作顺序?
考虑这个函数:
JVM的实现是否需要在- 1
之前执行+ b
?
如果我们有一个附加到 JVM 的系统分析器,我们会在+ b
操作之前看到正在执行的+ 1
操作吗?
java - 是否可以为另一种注释类型的注释字段指定默认值?
还有一个案例:
java - 哪些操作可能(不)抛出 StackOverflowError?
什么时候会StackOverError
抛出?
或者更确切地说,它什么时候不会被抛出?
例如,如果我们使用原始运算符+
, +=
, -
, -=
, ==
<
, >
, /
,%
等:
有什么保证StackOverflowError
不会被抛出吗?
java - 什么(在规范中)保证“非短路逻辑运算符实际上不会短路?
这是直接受到这个问题的启发。
有许多引用/声明,当应用于布尔值时,按位运算符不会短路。所以换句话说boolean a = f() & g()
, wheref()
和bothg()
返回布尔值,总是会被评估。
但是,JLS只说:
15.22.2 布尔逻辑运算符 &、^ 和 |
当 &、^ 或 | 的两个操作数 运算符的类型为 boolean 或 Boolean,则按位运算符表达式的类型为 boolean。在所有情况下,操作数都会根据需要进行拆箱转换(第 5.1.8 节)。对于 &,如果两个操作数值都为真,则结果值为真;否则,结果为假。
对于 ^,如果操作数的值不同,则结果值为真;否则,结果为假。
对于 |,如果两个操作数的值都为假,则结果值为假;否则,结果为真。
这如何保证两个操作数都被实际评估?除了,如果其中一个参数(可能是第二个/正确的第一个被评估的)违反条件xor
,您仍然可以中断并返回结果。
例如。只需要评估为假即可将表达式评估为假。
请注意:我不是在问它是否以这种方式实现(不会短路)-当然是这样。a & b
b
我在问:
用短路实现它会违反语言标准吗?
java - 为什么 Integer.MAX_VALUE + 1 == Integer.MIN_VALUE?
System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);
是真的。
我知道Java中的整数是32位的,不能超过2 31 -1,但我不明白为什么在它的MAX_VALUE
结果中加1MIN_VALUE
而不是在某种异常中。更不用说像 Ruby 那样将透明转换为更大的类型。
这种行为是否在某处指定?我可以依靠它吗?
java - 如果覆盖类的子类中的字段,子类有两个同名(但类型不同)的字段?
我有 3 节课:
为什么下面的代码会编译?而且,为什么测试通过而没有任何运行时错误?
java - 线程中的最终字段语义
这是来自 JLS 17.5:
final 字段的使用模型很简单。在该对象的构造函数中设置对象的最终字段。在对象的构造函数完成之前,不要在另一个线程可以看到它的地方写对正在构造的对象的引用。如果遵循这一点,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。它还将看到至少与最终字段一样最新的最终字段引用的任何对象或数组的版本。
JLS 17.5 中的讨论包括以下示例代码:
我尝试重用此代码来复制上述情况,这就是我所拥有的:
我可以测试 final 如何正确读取,但是当它读取不正确时如何复制(即在构造函数完成之前有对胎面的引用时?)
java - 为什么Java允许嵌套类中的“public static final”用于简单类型而不是数组?
可能重复:
无法在内部类中声明 Public static final String s = new String(“123”)
在以下示例中,为什么允许 CONST_ONE、CONST_TWO,但 CONST_THREE 被标记为错误“内部类不能具有静态声明”?
我可以通过使用public interface GroupOne
来获得我需要的行为,但我仍然想了解为什么常量的处理方式不同。我看到的唯一区别是第三个是一个数组,因此它的成员是可修改的,但如果有的话,这似乎会触发一个不同的错误。
java - 同步块中的意外代码
以下 Java 代码生成以下 JVM 字节码。
我很好奇为什么会生成偏移量 31 到偏移量 36 的代码。JLS7 或 JVM7 规范中没有提到这一点。我错过了什么吗?
即使我删除了 println 语句,代码(偏移量 31 到偏移量 36)仍然会生成,只是在较早的位置,因为 println 调用已被删除。
java - 是否有移动版的 Java 语言规范?
我不确定这是否是绝对最好的提问地点,但我认为这里的答案概率最高(因为主题)。
有没有人遇到过 Java 语言规范的 mobi (Amazon Kindle) 版本?我知道我可以在 Kindle 上阅读 PDF,但与 mobi 相比,它的体验更少。