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

为什么这不是用Java编译?

任伟
2023-03-14
问题内容

如果你给

    public class test
    {
        public static void main(String ar[])
        {
            if (true)
                int i=0;
        }
    }

它没有编译,但是带有花括号的相同代码是:

    public class test
    {
        public static void main(String ar[])
        {
            if (true)
                {int i=0;}
        }
    }

有什么解释?


问题答案:

基本上,变量声明只能在块中声明。

查看
Java语言规范中“语句”的语法
-它包括Block,但不包括LocalVariableDeclarationStatement-
后者是block语法的一部分。


这实际上是实用主义的问题:如果没有括号,则只能使用一个语句。如果没有后续语句,则声明变量是没有意义的,因为您不能 使用
该变量。您也可以只具有一个不带变量声明的表达式语句,这
允许的。

这样可以防止出现以下错误:

if (someCondition)
    int x = 0;
    System.out.println(x);

乍一看可能还不错,但实际上等效于:

if (someCondition)
{
    int x = 0;
}
System.out.println(x);

就我个人而言,无论如何我总是使用花括号,因为它使这种错误更难以创建。(我曾经被它咬过,发现有问题的代码令人惊讶地棘手。)



 类似资料:
  • 问题内容: 这段代码使我凝视了几分钟: 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 这不是一个。 用法:

  • 如果我运行deldeldel(“adel”),它会返回一个,但是,adel的长度是4,这意味着最后一个字符串索引是3,为什么str.substring(4,str.length()没有超出范围?

  • 问题内容: 这段代码使我凝视了几分钟: (这里的第137行) 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 它不是一个keyword,而是一个label。 用法:

  • 奇怪的是,标记为“OK”的行编译得很好,但标记为“Error”的行失败了。它们看起来基本上是一样的。

  • 在方法或类范围内,下面的行编译(带有警告): 在类作用域中,变量获取其默认值,以下给出未定义引用错误: 这难道不是第一个应该以相同的未定义引用错误结束吗?或者第二行应该编译?或者我错过了什么?

  • 问题内容: 对于Java的处理方式以及涉及到的数字和其他类型的数字,我有些困惑。例如: 输出(也许您应该先猜测一下): 这不能编译是可以预料的,是不同的对象。 令我有些惊讶的是,默认情况下9是an ,并且1)甚至没有编译。请注意,您不能将放入期望使用的方法中,但是在这里它们是相等的。 由于两个相同的原因,这令人惊讶,但似乎更糟。 不足为奇,因为自动装箱到和。 不足为奇,因为不同类中的对象不应该是。