我正在为石头剪刀布游戏编写一段代码。我正在编写一个方法,根据计算机是否获胜、平局或用户获胜分别返回 1、0 或 -1。到目前为止我有这个代码:
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;
}
case 'P': switch (computerMove) {
case 'R': return -1;
case 'P': return 0;
case 'S': return 1;
}
case 'S': switch (computerMove) {
case 'R': return 1;
case 'P': return -1;
case 'S': return 0;
}
}
}
它在最后一个括号中向我抛出“缺少返回语句”。有什么建议吗?
附注ComputerMove 和playerMove 唯一可用的选项是R、P 和S!
最佳答案
其他人告诉您将 default
添加到 switch
语句中。在这种情况下根本不需要,尽管这是一个需要遵循的很好的一般规则。
但是,您需要考虑如果 playerMove
和/或 computerMove
不具有 3 个预期值之一('R'
、'P'
或 'S'
)。
如果 computerMove
不这样做,您希望逻辑流退出外部 switch
语句,而不是进入下一个 case
(虽然从技术上讲,它们都会失败,但仍然如此),因此在每个外壳中添加一个 break
。
如果发生这种情况,或者 playerMove
没有有效值,则逻辑流将到达方法末尾,并且那里没有 return
语句。 那是你的编译错误。
这里最好的解决方案是,因为您希望不会陷入这种情况,所以将其声明为异常(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);
}
}
关于java - 嵌套 Switch 语句中缺少 Return 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43036616/