2015-07-13 4 views
-1

Я пытаюсь написать код, который, учитывая время суток в терминах часа, минуты, секунды и «половины дня» (т. Е. AM или PM), вычисляет и возвращает часть дня (значение типа double), которое прошло с полуночи (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')); 
    } 
} 

Однако, когда я пытаюсь скомпилировать этот код, он дает мне ошибку

отсутствующий оператор возврата.

Я не понимаю, что не так с кодом.

+2

Что будет 'fractionOfDay (1.0, 1.0, 1, 'Q')' return? – immibis

+0

@immibis, что вы имеете в виду Q? есть только AM и PM? –

+2

вы это знаете, но компьютер этого не делает. И что должно произойти, если вы все равно решите написать? – immibis

ответ

3

Это потому, что все ваши заявления о возврате находятся внутри операторов if. Java видит это и судит о том, что есть вероятность, что ни одно из этих утверждений if не будет принято. Тогда что будет? Не было возврата, поэтому он выплевывает ошибку.

Итак, вам нужно добавить оператор return в разделе else или вне блока if/else if. Что-то вроде этого решит вашу проблему. Вам нужно будет выяснить, что делать, если ни один из ваших путей не будет принят. В этом случае он возвращает -1 (значение по умолчанию у)

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'. Возможно, вы знаете, что это никогда не будет чем-то другим, но компилятор этого не знает, поэтому он полагает, что существует вероятность того, что код может попасть в конец метода, не возвращая ничего, что является no-no.

Поскольку это общедоступный метод, вам действительно нужно, чтобы ваш код делал что-то с случаями, когда аргументы не вписываются в один из ваших случаев, поскольку внешний класс может испортить и назвать его неправильным. Очевидное решение поставить throw в конце метода, что-то вроде

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

Это предотвратит сообщение об ошибке возникновения.

+0

Спасибо за вашу помощь :) –

+0

Где я должен это положить точно? –

+0

В качестве последнего утверждения метода. – ajb

Смежные вопросы