当前位置: 首页 > 面试题库 >

Java标签不规则(可能是错误?)

吴俊风
2023-03-14
问题内容

如果我们查看Java标准
§14.7,就会发现语句可能带有标签前缀,例如:

LabeledStatement:

标识符:声明

从理论上讲,标签应该能够标记任何后续的语句。因此,例如,以下内容将相应地进行编译:

public class Test {
    public static void main(String[] args) {
    hello:
        return;
    }

}

直观地,这也可以编译为:

public class Test {
    int i;
    public static void main(String[] args) {
        Test t = new Test();
    label:
        t.i = 2;        
    }
}

但是以下内容 无法 编译:

public class Test {
    public static void main(String[] args) {
    oops:
        int k = 3;  
    }
}

即使这样做(请注意范围括号):

public class Test {
    public static void main(String[] args) {
    oops:
        {
            int k = 3;
        }
    }
}

因此,问题取决于声明是否为语句。根据标准(和在线文档):

除了表达式语句,还有两种其他类型的语句:声明语句和控制流语句。声明语句声明一个变量。

我已经在OSX和Windows的Java 7和8中注意到此行为。这是错误还是我误解了标准?


问题答案:

表达方式

int k = 3;

是局部变量声明语句。

statement在标签语句的语法使用

LabeledStatement

Identifier
Statement

不包含局部变量声明语句。因此,您不能在带标签的语句中直接使用它们。

局部变量声明语句可以在可以在带标签的语句中使用的块中使用。



 类似资料:
  • 签名规则 兑吧与开发者之间进行接口交互请求,都会包含签名参数,链接中签名参数的生成,都是通过MD5生成的签名参数,以确保请求安全。 1.MD5签名原理 兑吧签名md5签名原理如下: 将请求参数和appSecret封装成Map集合,按照参数名(Key)进行升序排列,将排序后Map集合的参数值(value)拼装成字符串进行MD5签名。其中appSecret在签名中的顺序取决于他在所有参数名中的顺序。

  • 我得到了这个解析器语法,我还想用它来使用类似于Javascript模板的东西-字符串。 这个lexer语法 我不明白,为什么甚至可以匹配一些像空映射或像“world`”这样的映射,因为映射需要在中间有一个“:”。并且为什么规则模板字符串不匹配整个“Hello World”从一个滴答到另一个滴答? 编辑: 当我注意到Lexer没有被重新生成时,我得到了这样的错误:“不能为string literal

  • 通过前面的学习我们知道 Java 实际上没有多维数组,只有一维数组。多维数组被解释为是数组的数组,所以因此会衍生出一种不规则数组。 规则的 4×3 二维数组有 12 个元素,而不规则数组就不一定了。如下代码静态初始化了一个不规则数组。 int intArray[][] = {{1,2}, {11}, {21,22,23}, {31,32,33}}; 高维数组(二维以及二维以上的数组称为高维数组)是

  • 我是Drools Fusion的新手,我想知道为什么我的规则不总是被取消。我用的是Drools 6.3。以下是我要插入的事件: 这是我的规则文件: 这是我的输出: 我预计我的规则将触发2次,并给出以下输出: 我可能忽略了一些事情,但我没有找到关于我的问题的太多信息。有人能解释一下这里到底发生了什么吗?非常感谢。

  • 我使用的是Antlr 4.7.2。我试图实现一个“If Else”语句: 主要问题是ParseTree中没有包含可选规则,因此我认为我没有得到可选规则的语法错误。 我现在的语法定义是:

  • 我目前正在Ubuntu 10.04 64位上构建SE Android 4.2.1_R1。我几乎完成了make过程,但我目前被以下错误所困。 如有任何帮助,我们将不胜感激。