2015-07-13 78 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