2010-10-01 17 views
12

Mam prosty program działania w Androidzie. zasadniczo klasa po prostu rozszerza aktywność. Ale po uruchomieniu otrzymuję ClassCastException w konstruktorze mojej klasy. Nie ma nawet zdefiniowanego konstruktora, więc musi znajdować się w konstruktorze superklasy, która jest Aktywnością.Android classcastexception na uruchamianie działalności

Niestety, debugger nie podaje żadnych szczegółowych informacji na temat klasy, którą próbuje obsłużyć.

oto StackTrace:

Thread [<1> main] (Suspended (exception RuntimeException)) 
    ActivityThread$PackageInfo.makeApplication(boolean, Instrumentation) line: 649 
    ActivityThread.handleBindApplication(ActivityThread$AppBindData) line: 4232 
    ActivityThread.access$3000(ActivityThread, ActivityThread$AppBindData) line: 125  
    ActivityThread$H.handleMessage(Message) line: 2071 
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
    Looper.loop() line: 123 
    ActivityThread.main(String[]) line: 4627  
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
    Method.invoke(Object, Object...) line: 521 
    ZygoteInit$MethodAndArgsCaller.run() line: 868 
    ZygoteInit.main(String[]) line: 626 
    NativeStart.main(String[]) line: not available [native method] 

i kiedy patrzę na RuntimeException uzyskać:

detailMessage "Unable to instantiate application com.test.MyApp: java.lang.ClassCastException: com.test.MyApp" (id=830067694464)

jedyny kod jest

package com.test; 
import android.app.Activity; 
public class MyApp extends Activity { 

} 
+0

Czy możesz tutaj dodać kod programu? –

+1

nie można odczytać niczego z powyższego. opublikuj swój kod programu. – Umesh

+3

@clamp: Przejdź obok wyjątku i zezwól Androidowi na zbieranie informacji o stosie. Zobacz go w okienku LogCat w perspektywie DDMS. To może dać ci więcej informacji o tym, co się dzieje. – CommonsWare

Odpowiedz

24
  1. Otwarte AndroidManifest.xml
  2. Znajdź tag application
  3. Usuń atrybut android:name (jeśli istnieje)
  4. Dodaj atrybut android:name="android.app.Application"

To, co zrobiłem i problem zniknął.

P.S: W kroku 4 użyj niestandardowej nazwy klasy aplikacji, jeśli taką posiadasz (opcjonalnie).

+0

dzięki, ale to nie pomaga. Czy naprawdę chcesz ustawić ciąg "android.app.Application" tam lub faktycznie nazwę aplikacji? – clamp

+2

zredagował odpowiedź, mam nadzieję, że stało się bardziej jasne. Tak, mam na myśli właśnie "android.app.Application" –

+0

dzięki, że rzeczywiście naprawili problem! – clamp

2
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
} 

dodać to i pisać swój pełny manifest.xml

5

miałem ten sam problem.

W moim przypadku miałem klasę rozszerzonej aplikacji, która została przywołana w pliku manifestu jako atrybut znacznika aplikacji.

Kiedy ponownie przeanalizowałem klasę Eclipse nie zawierało odnośnika w manifeście (co zrozumiałe, ale frustrujące i myląco), które spowodowało tę kwestię.

To również wiąże się z odpowiedzią Maxima, ale wyjaśnienie wydaje się być rozbieżnością.

Po zmianie nazwy atrybutu na plik, którego nazwa została zmieniona, problem został rozwiązany.

+0

Wiem, że problem jest stary ale po prostu opublikowany, aby spróbować i pomóc innym, którzy mogą natknąć się na to w przyszłości. – slipp3ry

+0

bardzo pomocny. Wobec tego samego problemu, możesz mi pomóc rozwiązać ten problem. – Sreeram

0

przypadku korzystania z map Google:

<uses-library android:name="com.google.android.maps" /> 

Zapamiętaj tę linię. Nie mogę uwierzyć, że o tym zapomniałem i zmarnowałem tyle czasu.

4

zrobiłem głupi błąd,

my_textView = (<b>Button</b>) findViewById(R.id.tvMyTextView); 

i to spowodowało ClassCastException ..

zmieniłem to oczywiste,

my_textView = (<b>TextView</b>) findViewById(R.id.tvMyTextView); 

i to działało ..

nie wiem jak, ale wszystko, co mogę powiedzieć jest to, że takie głupie błędy mogą również spowodować powyższy problem ..

+0

Tak, to prawda! Spędziłem około trzech godzin próbując rozwiązać wszystkie te błędy, gdy potrzebowałem ImageButton, a nie Button, a wszystkie błędy obecne w tym poście zniknęły! – WebDevDanno

0

zgadzam się z odpowiedzią Mahesh za .. Stanie się tak z powodu przypisywania pogląd bez rzucania ...

To samo stanie się, jeśli jesteś oddające ImageButton Zobacz widok przycisku lub inną klasę widoku.

0

miałem ten sam problem, i dowiedzieć się, że to spowodowało błędne zastosowanie w preferences.xml <CheckBoxPreference android:key="@+id/string" /> musiała być zmiana <CheckBoxPreference android:key="string" />

2

miałem ten sam problem występujący sporadycznie, czasami pozornie wywołane przez re - porządkowanie elementów w układzie XML.

Jeśli zezwolisz aplikacji na kontynuowanie wykonywania po nieprzechwyconym wyjątku, powinieneś zauważyć, że otrzymasz znacznie bardziej przydatny stacktrace w "adb logcat", niż możesz łatwo wyjść z debuggera w miejscu, w którym się zatrzymuje.

Zazwyczaj wskazuje to miejsce, w którym rzeczywiście wystąpił wyjątek, który zazwyczaj nie jest miejscem, w którym zatrzymuje się w debugerze.

W moim przypadku wydawało się, że jest to niedopasowanie między identyfikatorami zasobów - poruszanie obiektami w pliku XML wydawało się mylne z takimi rzeczami, że kiedy robiłem view.findViewById (R.id.something), to nie było zwracanie mnie prawidłowy obiekt. Przesyłałem obiekt do TextView, który powinien być całkowicie poprawny, zgodnie z zawartością mojego układu XML, ale ulegał awarii.

Może się zdarzyć, że masz błąd, gdy wykonujesz nieprawidłowy rzut, co z pewnością spowoduje wystąpienie tego wyjątku, ale w moim przypadku wymuszenie wyczyszczenia i odbudowania rozwiązało problem - zregenerowało skompilowane układy i identyfikatory zasobów od zera i wszystko działało zgodnie z oczekiwaniami.

+0

Tak, miałem dokładnie taki sam przypadek. Oczyściłem projekt i zadziałało. – akshay7692

+0

+1 Powinienem był przeczytać to najpierw. Dzięki! – Suzi

0

Miał podobny problem z ClassCastException mówiąc mi, że nie mogłem rzucić EditText jako TextView. Nie próbowałem. Próbowałem oczyścić projekt, ale otrzymałem kilka błędów "nie mogę usunąć pliku ...". Zamknięte środowisko Eclipse, ponownie otwarte, wyczyszczone projekt. Problem zniknął. Oczywiście nie będzie to działać w każdym przypadku, ale jest to jedna z możliwości.

Powiązane problemy