1

ここの列挙に関するセクションのJava言語仕様で次のことに気づきました:link

switch(this) {
  case PLUS:   return x + y;
  case MINUS:  return x - y;
  case TIMES:  return x * y;
  case DIVIDE: return x / y;
}
throw new AssertionError("Unknown op: " + this);

ただし、switchステートメントの定義セクションを見ると、この特定の構文(関連するthrowステートメント)はどこにもありませんでした。

この種の「デフォルトの場合は例外をスローする」構文糖衣を列挙型定義の外で使用できますか?特別な名前はありますか?これは、「リストにないものはすべて例外をスローする」というこの動作をショートカットするための良い/悪い習慣と見なされますか?

4

5 に答える 5

3

AssertionErrorをスローするためのそのチュートリアルの作成者の恥-UnsupportedOperationExceptionのようにJavaがすでに提供している例外を利用してみません

于 2010-05-20T19:52:05.253 に答える
2

私があなたを得るかどうかはわかりませんが、あなたはそれが投稿されたコードサンプルthrowの構文の一部であると信じているようです。switchそうではありません。switchブロックとステートメントは2つのthrow別個のものであり、このコードではたまたま隣り合って配置されています。

詳細:すべての4つcaseの部分にステートメントが含まれているため、メソッド内の後続の命令はスキップされます。一致する部分がない場合、実行はブロックに続く行で続行されます。これはたまたま。です。switchreturncaseswitchthrow

非常によく似た方法でthrowafterを使用できます。if

if (something) {
    return aValue;
}

throw new Exception("Nope");
于 2010-05-20T19:11:18.000 に答える
0

Eclipseでは、switchステートメントですべての列挙値をカバーしないと、コンパイル時に警告が生成されます。

ただし、default:警告が機能しなくなった場合。したがって、一部のIDEでは、defaultすべての列挙値がswitchステートメントでカバーされている場合に大文字と小文字を区別しないという明確な利点があります。

一般に、switchステートメントが5〜6ケースを超える場合は、コードの再設計を検討してください。通常、Javaの列挙型が本格的なクラスであり、列挙型の値がファーストクラスのオブジェクトであることを人々は理解していません。そのため、多くの場合、switchステートメントを介して動作を駆動する代わりに、列挙型オブジェクトに作業自体を実行するように依頼できます。

この特定の例では、列挙型はメソッドdoOp( int x, int y)を持つことができ、各列挙型メンバーはこのメソッドの特定のフレーバーを実装できます。

于 2010-05-20T19:34:13.717 に答える
0

他の人が述べているように、これはシンタックスシュガーではありません。スイッチ上のすべてのブランチがメソッドから戻るため、これは機能します。他の列挙値がスイッチに入力された場合、switchステートメントはブランチを実行せずに完了し、その後、throwステートメントが実行されます。

switch(this) {
  case PLUS:   return x + y;
  case MINUS:  return x - y;
  case TIMES:  return x * y;
  case DIVIDE: return x / y;
  default: throw new AssertionError("Unknown op: " + this);
}

そのコードは機能的に同等です。2つの主な違いは、default句のないスイッチは、値がEnumに追加されたが、switchステートメントには追加されなかった場合に、コンパイラ警告を作成することです。

于 2010-05-20T19:34:51.423 に答える
0

defaultキーワードがあります:

switch (whatever) {
  // ...
  default: explode();
}

デフォルトのケースで例外をスローする場合は、

  default: throw new Explode();

他のすべてのブランチが包含関数から戻るため、この例はそのように機能するだけです。私の意見では、それはあまり良いコーディング習慣ではありません。

于 2010-05-20T19:11:35.377 に答える