我为此部分代码收到了编译错误"missing return statement"
。不知道为什么?我也知道这是一种低效的写作方式所以不要过于刻板:)
static int handValue(int card1, int card2){
if((card1+card2)>=10)
return 0;
if((card1+card2)<=10)
return card1+card2;
if(card1>=10 && card2<=9 && card2>=1)
return card2;
if(card2>=10 && card1<=9 && card1>=1)
return card1;
}
答案 0 :(得分:4)
编译器告诉您,对于所有可能的代码路径,您没有return
语句。虽然在您的情况下这是不可能的,但编译器并不是为了解决这个问题而构建的:所讨论的路径是if
块中没有任何card1
块被传入的值{{1 }和card2
。
原则上,您只需在最后添加最终return
以防止警告。
static int handValue(int card1, int card2){
if((card1+card2)>=10)
return 0;
if((card1+card2)<=10)
return card1+card2;
if(card1>=10 && card2<=9 && card2>=1)
return card2;
if(card2>=10 && card1<=9 && card1>=1)
return card1;
return -1; // example return statement
}
您需要选择合适的值才能返回。另一种方法是声明该方法应始终匹配其中一个语句,然后在方法结束时为throw
添加IllegalArgumentException
语句,而不是&#34;默认&#34;退货声明。由于这是一个未经检查的例外,呼叫者不必遵循捕获/指定原则。
但是,对于您的代码,只有前两个if
语句是可能的(总和将始终为>= 10
或< 10
,因此您可以减少整个逻辑块;虽然我怀疑你实际上并不打算这样做,但你的方法实际上相当于:
static int handValue(int card1, int card2){
if((card1+card2)>=10)
return 0;
else // if((card1+card2)<10) <---- note '<10' not '<=10' as in your original code
return card1+card2;
}
或只是
static int handValue(int card1, int card2) {
return ((card1 + card2) >= 10) ? 0 : (card1 + card2);
}
答案 1 :(得分:3)
这将有效:
static int handValue(int card1, int card2){
if((card1+card2)>=10)
return 0;
if((card1+card2)<=10)
return card1+card2;
if(card1>=10 && card2<=9 && card2>=1)
return card2;
if(card2>=10 && card1<=9 && card1>=1)
return card1;
return -1;
}
如果你定义一个返回类型,你必须在方法的每个可能路径中提供一个,或者你必须抛出这样的异常:
static int handValue(int card1, int card2){
if((card1+card2)>=10)
return 0;
if((card1+card2)<=10)
return card1+card2;
if(card1>=10 && card2<=9 && card2>=1)
return card2;
if(card2>=10 && card1<=9 && card1>=1)
return card1;
throw new RuntimeException("no cards!!!");
}
或
static int handValue(int card1, int card2)throws Exception{
if((card1+card2)>=10)
return 0;
if((card1+card2)<=10)
return card1+card2;
if(card1>=10 && card2<=9 && card2>=1)
return card2;
if(card2>=10 && card1<=9 && card1>=1)
return card1;
throw new Exception("no cards!!!");
}
答案 2 :(得分:1)
你编写函数的方式实际上保证在第一个或第二个if语句中终止,因为任何两个数字的总和大于或等于10或者它不是。然而,Java编译器不够聪明,无法弄明白,所以它告诉你如果所有if语句都失败,你应该有一个return语句。
为了修复错误,并确保实际可以达到你的第二个if语句,我会重写这样的函数:
static int handValue(int card1, int card2) {
if (card1 >= 10 && card2 <= 9 && card2 >= 1) {
return card2;
} else if (card2 >= 10 && card1 <= 9 && card1 >= 1) {
return card1;
} else if ((card1 + card2) <= 10) {
return card1 + card2;
} else {
return 0;
}
}