コンパイラ構築の教科書を見つけて、dangling-else ambiguityを調べてください。
Java やその他の恐ろしい構文を持つほとんどの言語では、スペースが存在します。どのように解釈しますか:
try
try
stuff();
catch (FooException exc)
handle(exc);
catch (BarException exc)
handle(exc);
catch (BazException exc)
handle(exc);
それは...ですか:
try {
try {
stuff();
} catch (FooException exc) {
handle(exc);
} catch (BarException exc) {
handle(exc);
}
} catch (BazException exc) {
handle(exc);
}
または:
try {
try {
stuff();
} catch (FooException exc) {
handle(exc);
}
} catch (BarException exc) {
handle(exc);
} catch (BazException exc) {
handle(exc);
}
dangling-else のあいまいさは、else
を最も内側の に関連付けることによって解決されif
ます。この貧弱なスタイルを処理するために、より複雑な複雑さを追加しますか? いいえ。
編集:例がカバーしていないコメントがありますcatch
。/ではなく中括弧を必要とするのは、適切な 奇妙な決定です。とにかく、完全を期すために、次のコードを検討してください。try
catch
finally
try {
stuff();
} catch (FooException foo)
try {
handle(foo);
} catch (BarException bar)
handle(bar);
catch (BazException baz)
handle(baz);
finally
release();
catch
のBazException
とはfinally
、インナーまたはアウターに関連付けられていtry
ますか? ここでも、言語設計委員会は曖昧さをなくすために大量の文法を追加できたかもしれませんが、ここでも明示的なスタイルが優先されます。Sun/Oracle での私の仕事は、言語が簡素化されて明示的な中括弧がすべての場所に義務付けられていれば、もう少し楽だったでしょう。