2015-07-13 103 views
-1

我正在尝试编写代码,根据一小时,分钟,秒和“半天”(即上午或下午)的时间计算并计算并返回当天的一小部分(类型为double的值),自午夜(上午12:00)开始。遗失退货声明

例如,

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')); 
    } 
} 

然而,当我尝试编译这段代码,它给我的错误

缺少return语句。

我不明白代码有什么问题。

+2

'fractionOfDay(1.0,1.0,1,'Q')'会返回什么? – immibis

+0

@immibis你是什么意思Q?只有AM和PM? –

+2

你知道,但电脑没有。如果你决定写它,会发生什么? – immibis

回答

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')); 
    } 
} 
+0

谢谢,我现在明白了关于添加else子句。谢谢。你有什么想法可以让代码更好吗? –

+0

通常,您希望将退货次数限制为一次。有些情况下需要两个,但真正尝试只有一个功能。所以最好返回y,并且只在if语句中赋值。 – JDrost1818

+0

@ JDrost1818不同意,这是一个应该由个别程序员决定的风格决定(或他们选择遵循的风格指南)。 – immibis

2

的代码不会告诉你的情况下该怎么做,其中a是其他东西比'A''P'。也许知道它永远不会是别的,但编译器不知道这一点,所以它认为有可能代码可能会触发方法的结尾而不返回任何东西,这是一个不允许的。

由于这是一个公共方法,因为外部类可能会导致错误并称之为错误,所以您应该让代码在某些情况下处理某些情况。显而易见的解决方案是把一个throw在方法结束时,像

throw new RuntimeException("Invalid arguments to fractionOfDay"); 

这将防止出现的错误消息。

+0

感谢您的帮助:) –

+0

我应该把它放在哪里? –

+0

作为该方法的最后一个陈述。 – ajb