ClassCastException

mickry_jordan

Grünschnabel
Hallo Zusammen,
ich muß im Studium eine DVP in JAVA schreiben, und sitze gerade über meinem Lehrbuch (leider Jobst). Beim Thema Cast-Anweisungen von Klassen stoße ich auf die ClassCastException, die aber eigentlich falsch ist.

Folgendes Szenario habe ich gabaut (verkürzt):

class Person
{
....
}

class Chef extends Person
{
....
}

class Test
{
public static void main()
{
Person person1(..........);
Chef chef1 = null;

// jetzt der Cast
chef1 = (Chef) person1;
}
}

Ohne try catch schmiert mir das Programm komplett ab, mit try catch wird die Exception gerufen. Für mein Verständnis ist das aber richtig und zulässig?

Ich benutze eclipse 3.0 und das java sdk 1.4.2_05

Wäre nett, wenn Ihr mir ein bißchen helfen könntet.
Vielen Dank im voraus

Mickey
 
Hi!

Dein cast erzeugt kein Kompilerfehler, sondern ein Laufzeitfehler.
Casten kannst du ein Objekt nur auf ein Elternobjekt oder eine implementierte Schnittstelle.
Du kannst also einen Chef als Person behandeln. Aber nicht eine Person als Chef zu behandeln, da eine Person, weder das Chefinterface implementiert, noch von Chef abgeleitet ist.
Wenn du aus einer Person ein Chefobjekt erzeugen willst, dann erstelle einen Konstruktor in Chef, der ein Personenobjekt erwartet und rufe mit diesem Objekt den super-Konstruktor auf.
Code:
public class Chef extends Person {
  pulbic Chef(Person _person){
    super(_person);
    [...]
  }
}

statt dem casting von Person auf Chef kannst du dann folgendes machen:
Code:
Chef myChef = new Chef(new Person(param1, ...));
 
Hi,
vielen Dank für Deine Hilfe. Ich habe eigentlich nur das Beispielcoding aus dem Buch übernommen. Hab übrigens ein ähnliches Beispiel in JAVA in 21 T. gefunden.

<zitat>
Nachfolgend ein fiktives Beispiel, in dem eine Instanz der Klasse VicePresident in eine Instanz der Klasse Employee konvertiert wird, wobei VicePresident eine Subklasse von Employee ist, die weitere Informationen definiert (z.B. dass der Vice-President besondere Privilegien in den Waschräumen hat):

Employee emp = new Employee();
VicePresident veep = new VicePresident();
emp = veep; // kein Casting in dieser Richtung nötig
veep = (VicePresident)emp; // muss explizit gecastet werden
<zitat ende>

Genau das habe ich doch auch gemachtt

Chef ist Subklasse von Person also chef1 = (Chef) person1;

Gruß

Mickey
 
kann es sein, dass person1 zu dem Zeitpunkt null ist? kannst du mal den Code als Zip anhängen? Das müsste man sich mit dem Debugger anschauen. Eigentlich hast du recht und es müsste gehen.
 
Zuletzt bearbeitet:
Nein, personal1 ist nicht null. chef1 hab ich einmal mit null probiert und einmal gefüllt, aber immer mit gleichem Effekt.

Danke für die Hilfe, Code ist angezippt. (Package Test;)

Gruß

Mickey
 

Anhänge

Hallo!

Du kannst aus einer Normalen Person keinen "Chef" machen, da diese die zusätzlichen Attribute und Methoden nicht aufweist.

Der Cast den du da versuchst ist illegal, da eine Person kein Chef ist . Anders herum würde das gehen, du kannst jeden Chef auf eine person casten.

Gruß Tom
 
Hi Tom,
in die andere Richtung funktioniert das ganze auch ohne explizitem Cast. Laut meiner 2 Bücher sollte die Richtung Sub = (Sub)Super auch funktionieren. Aber wie es scheint hast Du Recht und es funktioniert wirklich nicht.


Gruß

Mickey
 
*schämt sich* hätte ich eigentlich auch wissen müssen. Stand auf der Leitung.

Deine Bücher meinen vielleicht was anderes. Und zwar wenn du ein Objekt vom Typ Person hast, welches aber eigentlich ein Chef ist, kannst du es nach Chef zurückcasten.

Gängigstes Beispiel beim java.util.Vector, der nimmt nur java.lang.Object und liefert nur java.lang.Object. Da alle Klassen Unterklassen von Object sind, ist das kein Problem. Und danach (wenn man sie wieder hat) kann man sie einfach zurückcasten.

Code:
Vector v =new Vector();
Chef c=new Chef();
Object temp=c;
v.add(temp);
temp=null;
c=null;
temp=v.elementAt(0);
c=(Chef)temp;
 
Zuletzt bearbeitet:
Zurück