2011-08-16 19 views
5

Jestem nowy zarówno w środowisku Eclipse, jak i Java.Błąd kompilacji w środowisku Eclipse

Zastanawiam się, czy następujący błąd jest w kompilatorze Eclipses lub mojej instalacji.

Zdefiniowałem klasę publiczną w klasie publicznej, aby zdefiniować typ zwracanej metody usługi.

public class ServiceThing { 
    public class ReturnType {...} 
    public ReturnType serviceMethod (...) {...} 
    ... 
} 

W klasie gdzie wywołać metodę service I instatiate się ReturnType trzymać wiadomość domyślnie:

ReturnType returnType = new ReturnType(...); 

Kiedy spróbować zbudować to otrzymuję następujące błędy:

budowlane obszar roboczy: Wystąpiły błędy podczas kompilacji. Błędy z uruchomionym konstruktorem 'Java Builder' w projekcie "XXXX.android". java.lang.ArrayIndexOutOfBoundsException

Zapisanie nie powiodło się: Zapisanie nie powiodło się; java.lang.NullPointerException

I okazało się, że wymagane jest składnia:

ServiceThing serviceThing = ...; 
ReturnType returnType = serviceThing.new ReturnType(...); 

Ale kompilator nie powinien generować NullPointerException tak.

+0

Czy mogę zapytać, dlaczego potrzebujesz klasy publicznej w klasie publicznej? Jeśli jest to publiczne, dlaczego nie uczynić go całkowicie samodzielną klasą. – Gapton

+1

To tylko wyraźne wskazanie intencji klasy. To jest wyłącznie opcja, która może być użyta do zwracania typu zgłoszenia serwisowego. Jeśli umieściłbym go w sparowanym pliku, wydaje mi się, że będzie wyglądał bałaganiaro, ponieważ nie ma własnego życia. – bitestar

Odpowiedz

4

Dokonując ReturnType się public static class będzie pozbyć się odwołanie do instancji nadrzędnej i twoi

ReturnType returnType = new ReturnType(...); 

będzie działać zgodnie z oczekiwaniami go.

Bez instancji klasy podrzędnej modyfikatora static zawiera niejawne odwołanie do ich obiektów nadrzędnych. To jest powód, dla którego potrzebujesz instancji ServiceThing do utworzenia instancji ReturnType w tym przypadku.

+0

Dobra odpowiedź. To rozwiązanie jest faktycznie zatwierdzone w [Efektywna Java, druga edycja] (http://java.sun.com/docs/books/effective/) w pozycji 22: Preferuj statyczne klasy członkowskie w porównaniu z niestatycznymi. Nadal uważam, że kompilator powinien był napisać ten komunikat o błędzie: Nie można utworzyć instancji niestatycznej klasy członkowskiej bez załączającej instancji. – bitestar

Powiązane problemy