Erro “este método deve retornar um resultado do tipo int”?

Eu tenho este código abaixo e ele continua me dizendo que thanksgiving () deve retornar um tipo de resultado de int. Eu lancei todos os resultados apenas para ter certeza, mas nada parece estar funcionando! Por que estou recebendo esse erro?

public class Thanksgiving { private static final int YEAR = 2000; // first valid year for this method private static final int NOV1 = 3; // 2000/11/01 falls on a Wednesday private static final int THURS = 4; // (Sun = 0, Mon = 1, ..., Sat = 6) // Precondition: year > 1999 public static int thanksgiving(int year) { int day = firstOfMonth( year ); if ( day == THURS ) { return (int) 22; } if ( day > THURS ) { return (int) 29 - ( day - THURS ); } if ( day < THURS ) { return (int) 22 + ( THURS + day ); } } public static int firstOfMonth(int year) { int raw = year - 2000; int day = NOV1; for(int i = 0; i < raw; i++ ) { if( i % 4 == 0 ) { day = day + 2; } else { day++; } } return day % 7; } public static void main(String[] args) { for(int year = 2000; year <= 2100; year++) { System.out.print("T'giving " + year + " is Nov " + thanksgiving(year) + "; "); if (year % 3 == 1) { System.out.println(); } } } 

}

Neste código:

 public static int thanksgiving(int year) { int day = firstOfMonth( year ); if ( day == THURS ) { return (int) 22; } if ( day > THURS ) { return (int) 29 - ( day - THURS ); } if ( day < THURS ) { return (int) 22 + ( THURS + day ); } } 

Você está fazendo sua declaração de retorno em vários blocos se. E se nenhum deles for verdade? O compilador não permitirá isso, e você deve retornar um valor padrão na parte inferior ou lançar uma exceção. Ou então faça algumas das declarações if mais - se com o último else:

 public static int thanksgiving(int year){ int day = firstOfMonth( year ); if ( day == THURS ) { return (22; } else if ( day > THURS ) { return 29 - ( day - THURS ); } else { // else without the if // we know that ( day < THURS ) return 22 + ( THURS + day ); } } 

Além disso:

  • Não há necessidade de converter um int em um int.
  • Um problema não relacionado é que seu código usa muitos números "mágicos" e você deve evitar usá-los.

O problema é que todas as suas instruções de retorno estão dentro de uma instrução if. Se, por alguma razão, dia! = Quinta-feira, não quinta-feira (sei que isso é impossível), nada será devolvido. Altere seu código para ter um valor de retorno padrão:

 public static int thanksgiving(int year) { int day = firstOfMonth( year ); if ( day == THURS ) { return (int) 22; } else if ( day > THURS ) { return (int) 29 - ( day - THURS ); } else { return (int) 22 + ( THURS + day ); } } 

Você precisa de algo assim

 public static int thanksgiving(int year) { int day = firstOfMonth( year ); if ( day == THURS ) { return (int) 22; } else if ( day > THURS ) { return (int) 29 - ( day - THURS ); } else { return (int) 22 + ( THURS + day ); } } 

Você tem 3 instruções if no método thanksgiving() . E se nenhuma das condições ficar satisfeita? O que retornaria nesse caso? Então, o compilador está reclamando.

Todos os retornos estão em instruções if, neste caso, o compilador vê que pode haver uma situação na qual a function não retornará nada. Você precisa adicionar um retorno fora de qualquer ifs ou em uma instrução else.

O compilador Java é burro demais para perceber que, em qualquer situação, uma das suas condições será satisfeita. Veja as instruções if e pense que é possível que nenhuma delas seja satisfeita. Você pode adicionar um retorno no final do método que indica um caso de erro, pode lançar uma exceção ou pode assert false .