9

Javaでは、特定のキーワードの後に​​ステートメントまたはステートメントブロックを続けることができます。例えば:

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

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

同様にコンパイルします

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

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

forこれは、whileなどのキーワードにも当てはまります。

ただし、一部のキーワードではこれが許可されていません。synchronizedブロックステートメントが必要です。についても同じですtry ... catch ... finally。これには、キーワードの後に​​少なくとも2つのブロックステートメントが必要です。例えば:

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

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

動作しますが、以下はコンパイルされません。

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

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

では、なぜJavaの一部のキーワードはブロックステートメントを必要とし、他のキーワードは単一ステートメントだけでなくブロックステートメントも許可するのでしょうか。これは言語設計の矛盾ですか、それともこれには特定の理由がありますか?

4

3 に答える 3

4

中かっこを省略できるようにしようとすると、ぶら下がっている他のようなあいまいさが生じます。これはぶら下がりと同様の方法で解決できますが、そうでない場合は、おそらく解決しないのが最善です。

検討

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を信じています、キャッチブロックはたった1つのステートメントの周りにありました(間違っているかもしれません)。

于 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が追加されています。これらに{}ブロックしかない理由は2つあります。

  • それはベストプラクティスと見なされました
  • 1つのオプションのみを許可する方が簡単です。

Javaは機能が少ない言語であることを考えると、前者と同じかそれ以上の言語であると思います。

于 2012-06-12T06:56:51.037 に答える