9

Java allows for certain keywords to be followed by a statement or a statement block. For example:

if (true)
    System.out.println("true");

do
    System.out.println("true");
while (true);

compiles as well as

if(true) {
    System.out.println("true");
}

do {
   System.out.println("true");
} while (true);

This is also true for keywords like for, while etc.

However, some keywords don't allow this. synchronized requires a block statement. Same for try ... catch ... finally, which requires at least two block statements following the keywords. For example:

try {
    System.out.println("try");
} finally {
    System.out.println("finally");
}

synchronized(this) {
    System.out.println("synchronized");
}

works, but the following doesn't compile:

try
    System.out.println("try");
finally
    System.out.println("finally");

synchronized (this)
    System.out.println("synchronized");

So why do some keywords in Java require a block statement, while others allow a block statement as well as a single statement? Is this an inconsistency in language design, or is there a certain reason for this?

4

3 回答 3

4

如果你试图允许省略括号,你会得到一个悬空的 else-like 歧义。虽然这可以通过与 dangling-else 类似的方式来解决,但最好不要这样做。

考虑

try
try 
fn();
catch (GException exc)
g();
catch (HException exc)
h();
catch (IException exc)
i();

这是否意味着

try
    try 
        fn();
    catch (GException exc)
        g();
    catch (HException exc)
        h();
catch (IException exc)
    i();

或者

try
    try 
        fn();
    catch (GException exc)
        g();
catch (HException exc)
    h();
catch (IException exc)
    i();

我相信 CLU,catch 块只有一个语句(可能是错误的)。

于 2012-06-11T22:56:12.140 回答
2

这只是语言的设计决策及其编译器机制。

我同意这个决定。不需要代码块可能会使代码更短,但它肯定会引起混乱并产生无法预料的后果。

于 2012-06-11T21:41:11.990 回答
1

即使使用允许这样做的语句,不使用 { } 也会存在问题,这可能会造成混淆。解决这个问题的方法是严格使用代码格式化程序。许多地方总是需要 { } 以避免出现问题。

例如

if (condition)
    if (condition2)
        statement
  else // which if
     statement

do
    statement
    while (condition) // is it do/while or an inner loop?
       statement
  while (condition2)
    statement

我相信您可以为某些语句而不是 C 中的其他语句执行此操作的原因。在 C 中,您可以在没有语句块的情况下使用 if/do/while/for。然而,Java 中已经添加了 try/catch 和 synchronized。这些只有 { } 块的原因有两个。

  • 这被认为是最佳做法
  • 只允许一个选项更简单。

鉴于 Java 是一种功能精益语言,我怀疑后者与前者一样多或更多。

于 2012-06-12T06:56:51.037 回答