2012-06-11 7 views
9

Javaでは、特定のキーワードの後に​​文または文ブロックを続けることができます。たとえば、次のようにJavaでtry/catchまたはsynchronizedを実行するのになぜ文ブロックが必要ですか?

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

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

これもforようなキーワードにも当てはまりコンパイルなど

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

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

whileなど

しかし、いくつかのキーワードはこれを許可していません。​​にはブロックステートメントが必要です。 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でいくつかのキーワードは、ブロック文を必要としませんステートメント?これは言語デザインの不一致ですか、それとも何らかの理由がありますか?

+5

私は、単一のステートメントのアプローチは、似たようなことが起きた場合にのみ、frownedされ、使用されると考えています。 cは同期されていないか試していないかもしれないので、おそらく "より安全な"オプションを使いました。 –

+1

これは構文なので、 AFAIKブロックがなければならないという技術的理由はありません。自動的に作成できるからです。 –

+0

私の推測は、FWIWです:言語の設計者は、学習に役立つのに似た構文を他の言語と同じにしたいと考えました。しかし、新しい言語機能が追加された場所を感じて、より良いコーディング標準であると感じるものを強制します。あるいは、あまり頻繁に使用されていない言語機能のために、彼らはより良いコーディングの考えのために行ったでしょうか? – Marvo

答えて

4

中かっこを残しておこうとすると、曖昧さがあります。これはダングリング - 他と同様の方法で解決することができますが、おそらく最良ではありません。

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

考えてみましょうそれは私がCLUを信じ

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(); 

を意味しています、catchブロックは、(間違っている可能性があります)ただ一つの文の周りにいました。

+1

良い答え。 +1 – EJP

+0

if/elseブロックにも同様の問題があります。私はデザイナーがこれらの問題を避けたいという共通の問題があると考えています。 –

+0

良い例をありがとう、トム。しかし、これは同期表現に関する私の質問を説明していません。 – Bob

2

これは言語の設計上の決定とコンパイラの仕組みです。

私は決定に同意します。コードブロックを必要としないということは、コードを短くするかもしれませんが、混乱の原因となり、予期せぬ結果を招くことは確実です。

+0

私はコンパイラの設計を指していました。 Javaコンパイラはそれを受け入れません。おそらく、より良い表現は、「コンパイラ設計の決定」でした。 –

+0

Possessive。一定。 –

+0

@ Jonathan:ああ、大丈夫です。 :-) –

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 

私はあなたが文ブロックせずにしばらく/ため/ DO /場合は使用することができますCはCからのいくつかのステートメントではなく他人のためにこれを行うことができた理由を考えています。しかしtry/catchとsynchronizedはJavaで追加されました。これらに{}ブロックしかない理由は2つあります。

  • オプションを1つだけ許可するように簡単ですがベストプラクティス
  • と考えられました。

Javaが機能的な言語であるとすれば、それは後者の方が後者であると考えられます。

関連する問題