我是Java的新手,我自己也在学习。我尝试重载方法时遇到了麻烦。这是代码
public static void main(String[] args) {
calculateScore();
calculateScore(500);
calculateScore("Duy", 600);
calcFeetAndInchesToCentimetres(100, 3.5);
calcFeetAndInchesToCentimetres(100*12 + 3.5);
}
public static double calcFeetAndInchesToCentimetres(double feet, double inches) {
if (feet >= 0 && inches >= 0 && inches <= 12) {
double footToInches = feet * 12;
double centimetres = (inches + footToInches) * 2.54;
System.out.println("The value in centimetres is " + centimetres + " cm.");
return centimetres;
} else {
return -1;
}
}
public static double calcFeetAndInchesToCentimetres(double inches) {
if (inches >= 0){
double inchesToFeet = inches / 12;
double inchesRemain = inches - (inchesToFeet * 12);
calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain);
return 0;
} else {
return -1;
}
我的问题是,当我从第二种方法中取return 0
时,调试器会说&#34;缺少return语句&#34;。然后我尝试放return calcFeetAndInchesToCentimetres(inches);
,它可以工作,但程序运行了大约数千次。
然后我放return 0
,一切正常。但我不明白为什么我不能放return calcFeetAndInchesToCentimetres(inches);
,为什么我需要一个return语句,当上面的方法(带有2个参数)已经得到它时。如果我想在执行第二种方法时使用厘米转换的值(使用&#34; inches&#34;仅参数),我该怎么做?
另一件事我已经意识到在这个区块代码中
double inchesToFeet = inches / 12;
double inchesRemain = inches - (inchesToFeet * 12);
calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain);
inchesRemain将为0?但该方法效果很好。当我更改inchesToFeet = inches % 12
时,它只是没有显示任何内容。为什么呢?
答案 0 :(得分:5)
应该是:
public static double calcFeetAndInchesToCentimetres(double inches) {
if (inches >= 0){
double inchesToFeet = inches / 12;
double inchesRemain = inches - (inchesToFeet * 12);
return calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain);
} else {
return -1;
}
}
你说你已经尝试了return calcFeetAndInchesToCentimetres(inches);
但是这只是递归地调用你的方法而且它会永远地恢复,因为没有停止条件。
答案 1 :(得分:3)
使用方法重载,您有两种不同的方法。
calcFeetAndInchesToCentimetres
只需一个参数calcFeetAndInchesToCentimetres
带有两个参数现在当你打电话给calcFeetAndInchesToCentimetres(inches);
时,你正在调用一个只有一个参数的人。如果你从内部调用它,它将继续无限次地调用它。这是你看到的错误。
如果用return calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain);
替换它将调用另一个方法 - 那个带有两个参数的方法。这就是你真正想要做的事情。
修正版:
public static double calcFeetAndInchesToCentimetres(double inches) {
if (inches >= 0){
double inchesToFeet = inches / 12;
double inchesRemain = inches - (inchesToFeet * 12);
return calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain);
} else {
return -1;
}
}
答案 2 :(得分:0)
public static void main(String[] args) {
calculateScore();
calculateScore(500);
calculateScore("Duy", 600);
calcFeetAndInchesToCentimetres(100, 3.5);
calcFeetAndInchesToCentimetres(100*12 + 3.5);
}
public static double calcFeetAndInchesToCentimetres(double feet, double inches) {
if (feet >= 0 && inches >= 0 && inches <= 12) {
double footToInches = feet * 12;
double centimetres = (inches + footToInches) * 2.54;
System.out.println("The value in centimetres is " + centimetres + " cm.");
return centimetres;
} else {
return -1;
}
}
public static double calcFeetAndInchesToCentimetres(double inches) {
if (inches >= 0){
double inchesToFeet = inches / 12;
double inchesRemain = inches - (inchesToFeet * 12);
calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain);
return 0; //Here
} else {
return -1;
}
如果删除return 0,则显示缺少return语句,因为您处于if-else循环中。 让我们说你的输入英寸小于0然后它将去其他部分并返回-1 ..但是如果输入的英寸大于0那么它将转到if条件并且它将到达if的结尾声明然后没有什么可以返回所以对于if-else条件,if和else都应该返回一些东西。
解决这个问题的另一种方法是在if-else条件下创建一个局部变量,并在else部分完成后返回..这样天气它会进入if代码或者部分代码两次都会出现要返回的局部变量的某个值..
现在问题的第二部分: 你的代码看起来像
line 1 public static double calcFeetAndInchesToCentimetres(double inches) {
第2行if (inches >= 0){
第3行double inchesToFeet = inches / 12;
第4行double inchesRemain = inches - (inchesToFeet * 12);
第5行calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain);
第6行return calcFeetAndInchesToCentimetres(inches);
} else {
return -1;
{{ 1}}
所以在这种情况下,你一次又一次地调用同一个方法。 你从第1行开始直到第6行,然后你调用相同的方法,然后再次开始执行,第1行将执行到第6行,然后第1行一遍又一遍,直到所有内存都丢失并且堆栈溢出出现..
最佳实践代码可能如下所示:
}