switch
ステートメントにdefault
を追加するように指示されている人はいません。この場合はまったく必要ありませんが、従うのは一般的なルールです。
はしかし、あなたはplayerMove
および/またはcomputerMove
は3つの期待値('R'
、'P'
、または'S'
)のいずれかを持っていない場合はどうするか検討する必要があります。
computerMove
がない場合、あなたは外switch
ステートメントを終了するには、論理の流れをしたいのではなく、次のcase
に通って落下したい(技術的に、彼らはすべてちょうどそのを通じて落ちるが、それでもだろうが)、これを追加各外側にbreak
があります。case
これが壊れた場合、またはplayerMove
に有効な値がない場合、ロジックフローはメソッドの終了になり、そこにはreturn
ステートメントがありません。 そのはコンパイルエラーです。あなたがうまくいけば、その状況に入ることができないので、ここで
最良の解決策は、それが例外、すなわちthrow
Exception
であることを宣言することです。あなたのコードは可能性があり
:
private int nextPlay(char computerMove, char playerMove) {
switch (playerMove) {
case 'R':
switch (computerMove) {
case 'R': return 0;
case 'P': return 1;
case 'S': return -1;
}
break;
case 'P':
switch (computerMove) {
case 'R': return -1;
case 'P': return 0;
case 'S': return 1;
}
break;
case 'S':
switch (computerMove) {
case 'R': return 1;
case 'P': return -1;
case 'S': return 0;
}
break;
}
throw new IllegalStateException("Oops! I messed up!!");
}
しかし、それは、より説明的なエラーメッセージと良いでしょう:
private int nextPlay(char computerMove, char playerMove) {
switch (playerMove) {
case 'R':
switch (computerMove) {
case 'R': return 0;
case 'P': return 1;
case 'S': return -1;
}
throw new IllegalArgumentException("Invalid computer move: " + computerMove);
case 'P':
switch (computerMove) {
case 'R': return -1;
case 'P': return 0;
case 'S': return 1;
}
throw new IllegalArgumentException("Invalid computer move: " + computerMove);
case 'S':
switch (computerMove) {
case 'R': return 1;
case 'P': return -1;
case 'S': return 0;
}
throw new IllegalArgumentException("Invalid computer move: " + computerMove);
}
throw new IllegalArgumentException("Invalid player move: " + playerMove);
}
さて、あなたは代わりにdefault
句でそれらのthrow
のステートメントを追加することができます。同じ結果。
private int nextPlay(char computerMove, char playerMove) {
switch (playerMove) {
case 'R':
switch (computerMove) {
case 'R': return 0;
case 'P': return 1;
case 'S': return -1;
default: throw new IllegalArgumentException("Invalid computer move: " + computerMove);
}
case 'P':
switch (computerMove) {
case 'R': return -1;
case 'P': return 0;
case 'S': return 1;
default: throw new IllegalArgumentException("Invalid computer move: " + computerMove);
}
case 'S':
switch (computerMove) {
case 'R': return 1;
case 'P': return -1;
case 'S': return 0;
default: throw new IllegalArgumentException("Invalid computer move: " + computerMove);
}
default: throw new IllegalArgumentException("Invalid player move: " + playerMove);
}
}
デフォルトの場合を追加し、エラー処理を実行します –
'' playerMove'が '' R'''、 '' P'''、 '' S''でないとどうなりますか?コンパイラが知っている限り、それは任意の文字値を持つことができます。 Addメソッドの最後に新しいIllegalStateExceptionをスローする(「おっと!私は台無し!!」) ' – Andreas
コンパイラは、利用可能なオプションが 'R'、' P'、 'S'のみであることを知りません。その観点から見ると、彼らは他の性格を持つことができます。 – ajb