[英]Missing Return Statement in Nested Switch Statements
我正在为Rock,Paper,Scissors游戏编写一段代码。 我正在编写一种方法,该方法分别根据计算机获胜,平局还是用户获胜而返回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;
}
}
}
在最后一个括号中,它向我抛出了“丢失的返回声明”。 有什么建议么?
PS PS仅适用于computerMove和playerMove的选项是R,P和S!
其他人则告诉您将default
添加到switch
语句中。 尽管这是一个很好的一般规则,但在这种情况下根本不需要。
但是,您需要考虑如果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);
}
现在,您可以将这些throw
语句添加到default
子句中。 结果相同。
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);
}
}
我的建议
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int x=nextPlay('R','P');
System.out.println(x);
}
private static int nextPlay(char computerMove, char playerMove)
{
if(playerMove=='R')
{
if(computerMove=='R')
return 0;
else if(computerMove=='P')
return 1;
else
return -1;
}
else if(playerMove=='P')
{
if(computerMove=='R')
return -1;
else if(computerMove=='P')
return 0;
else
return 1;
}
else
{
if(computerMove=='R')
return 1;
else if(computerMove=='P')
return -1;
else
return 0;
}
}
非常感谢大家! 我决定简单地将每个switch语句中的一种情况设置为默认值(当然跟踪它是哪个字符),它解决了该问题。
我知道,如果char不是预期的字符,可能会导致一些问题,但是我的老师说这没问题,下次我会使用其他方法(如建议的那样)!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.