2013-03-08 12 views
5

Obecnie uczę się podstawowej Java i mam problem z moim kodem, którego nie mogę wymyślić. Zasadniczo to, co mówi tytuł. Mój kompilator Java mówi mi, że jest błąd z moją niestandardową metodą compareTo, mówiąc, że musi zwrócić int. Problem polega na tym, o ile mogę powiedzieć, że zwraca on int. Mimo to wciąż daje mi błąd. Czy ktoś mógłby wskazać w moim kodzie, co jest nie tak? I już wdrożyłem porównywalne w mojej klasie. Oto moja metoda:Zmodyfikowana Java metoda compareTo mówi, że musi zwrócić int, ale powinna zwracać jedną

public int compareTo(Homework other) { 
    if (getDaysLate() < other.getDaysLate()) { 
     return -1; 
    } else if ((dateSubmitted == other.dateSubmitted) 
      && (files.compareTo(other.files) == -1)) { 
     return -1; 
    } else if ((dateSubmitted == other.dateSubmitted) 
      && (files == other.files)) { 
     if (name.compareTo(other.name) == -1) { 
      return -1; 
     } else if (name.compareTo(other.name) == 1) { 
      return 1; 
     } else if (name.compareTo(other.name) == 0) { 
      return 0; 
     } 
    } else { 
     return 0; 
    } 
} 

Odpowiedz

1

Brakuje jeszcze po tej branży:

else if (name.compareTo(other.name) == 0) { 
    return 0; 
} 

Jeśli test nie powiedzie się (compareTo nie zwraca 0) metoda musiałaby wyjść bez wartości powrotnej, co jest nielegalne w Javie.

Również, compareTo może zwracać dowolną liczbę całkowitą, nie tylko 0, 1 i -1.

2

W trzeciej kolumnie znajduje się ścieżka, która nie zwraca niczego.

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) { 
    if (name.compareTo(other.name) == -1) { 
     return -1; 
    } 
    else if (name.compareTo(other.name) == 1) { 
     return 1; 
    } 
    else if (name.compareTo(other.name) == 0) { 
     return 0; 
    } else return ... 
} 

BTW, nie jestem pewien, czy nadążam logikę implementacji, ponieważ wydaje się, że wracasz 0 jeśli dateSubmitted != other.dateSubmitted. compareTo powinien również być anty-symetryczny (tj. sgn(x.compareTo(y)) == -sgn(y.compareTo(x))), ale twoja implementacja nie jest.

+0

@ TedHopp Right (dzięki, naprawiono). Poprawiłem również, że antysymetria jest wymagana tylko dla ** znaku ** wyniku (oba są równe zero lub jeden jest dodatni, a drugi ujemny). Wartość bezwzględna nie ma znaczenia. – Javier

1

Jak możesz być pewien (z tymi wszystkimi, jeśli i poza tym), że zawsze zwracasz int? Nie wydaje mi się to tak oczywiste i najwyraźniej kompilator zgadza się ze mną.

Jednym ze sposobów rozwiązania tego problemu (prawdopodobnie nie jest to najlepsze) jest dodanie na koniec funkcji return -1; //or whatever value.

1

W drugiej instrukcji else-if znajduje się ścieżka kodu, która może nie zwracać niczego. Mówisz:

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) { 
    if (name.compareTo(other.name) == -1) { 
     return -1; 
    } 
    else if (name.compareTo(other.name) == 1) { 
     return 1; 
    } 
    else if (name.compareTo(other.name) == 0) { 
     return 0; 
    }  

, ale co, jeśli żadna z tych rzeczy nie jest prawdziwa? Spróbuj zmienić ostatnią wartość else - if w twojej drugiej instrukcji else-if na else.

0

Metoda powinna zwrócić odpowiednią wartość na wszystkich ścieżkach przepływu kodu; innymi słowy, we wszystkich warunkach, kiedy metoda powraca. W następującym bloku if nie powraca na jednej ścieżce, którą zaznaczyłem.

else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) { 
     if (name.compareTo(other.name) == -1) { 
     return -1; 
     } 
     else if (name.compareTo(other.name) == 1) { 
     return 1; 
     } 
     else if (name.compareTo(other.name) == 0) { 
     return 0; 
     } 
     // It should return something here, if none of the above "if" statements match. 
     // Or one of the above "else if" should be changed to "else" 
    } 
Powiązane problemy