我正在尝试编写代码,根据一小时,分钟,秒和"一半的时间给出一天的时间" (即AM或PM),计算并返回自午夜(12:00 AM)起已经过的一天中的一小部分(双重值)。
例如,
System.out.print(fractionOfDay(12, 0, 0, 'A'));
将打印0.0
System.out.print(fractionOfDay(12, 0, 0, 'P'));
将打印0.5
System.out.print(fractionOfDay(11, 59, 59, 'P'));
会打印0.999988426
我写了以下代码:
public class FractionOfDay {
public static double fractionOfDay(double h, double m, int s, char a ) {
if (a == 'P' && h == 12) {
double x = (h * 60 * 60) + (m * 60) + (s);
double y = x / 86400;
return y;
} else if (a == 'P' && h != 12) {
double x = ( (h + 12) * 60 * 60) + (m * 60) + (s);
double y = x / 86400;
return y;
} else if (a == 'A' && h == 12) {
double x = (m * 60) + (s);
double y = x / 86400;
} else if (a == 'A' && h != 12) {
double x = ( (h) * 60 * 60) + (m * 60) + (s);
double y = x / 86400;
return y;
}
}
public static void main(String[] args) {
System.out.println(fractionOfDay(12, 0, 0, 'P'));
}
}
但是,当我尝试编译此代码时,它会给我错误
缺少退货声明。
我不明白代码有什么问题。
答案 0 :(得分:3)
那是因为你的所有return语句都在if语句中。 Java看到了这一点,并判断有可能不会采用这些if语句。然后会发生什么?没有回报,所以它会发出错误。
所以你需要在else子句下或if / else if块之外添加一个return语句。这样的事情可以解决你的问题。当你的所有路径都没有被采取时,你必须弄清楚要做什么。在这种情况下,它将返回-1(默认值为y)
public class FractionOfDay {
public static double fractionOfDay(double h, double m, int s, char a ) {
double y = -1;
if (a == 'P' && h == 12) {
double x = (h * 60 * 60) + (m * 60) + (s);
y = x / 86400;
} else if (a == 'P' && h != 12) {
double x = ( (h + 12) * 60 * 60) + (m * 60) + (s);
y = x / 86400;
} else if (a == 'A' && h == 12) {
double x = (m * 60) + (s);
y = x / 86400;
} else if (a == 'A' && h != 12) {
double x = ( (h) * 60 * 60) + (m * 60) + (s);
y = x / 86400;
}
return y;
}
public static void main(String[] args) {
System.out.println(fractionOfDay(12, 0, 0, 'P'));
}
}
答案 1 :(得分:2)
在a
不是'A'
或'P'
的情况下,代码不会告诉您该怎么做。也许你知道它永远不会是其他任何东西,但是编译器不知道这一点,所以它认为代码有可能在没有返回任何东西的情况下到达方法的末尾,这是一个不-没有。
因为这是一个公共方法,所以当参数不适合你的一个案例时,你真的应该让你的代码做一些事情,因为外部类可能搞砸并用错误的东西调用它。显而易见的解决方案是在方法的末尾添加throw
,类似于
throw new RuntimeException("Invalid arguments to fractionOfDay");
这样可以防止出现错误消息。