| 

.NET C# Java Javascript Exception

2
Hallo ich versuche den code unten richtig zu schreiben für mein uni assignment, was mir nicht so richtig gelingt.

public class testklasse {
public static void main (String[] args) {

Class clazz = Class.forName(args[0]);
AddressBookDataStore object = (AddressBookDataStore) clazz.newInstance();

String name = "Mustermann";
String prename = "Arda";
String vorname = "Michael";
String firstname = "Lisa";
Person2 p1 = new Person2(name, prename);
Person2 p2 = new Person2(name,vorname);
Person2 p3 = new Person2(name,firstname);
object.addPerson(p1);
object.addPerson(p1);
object.addPerson(p1);
object.getPersons(name);
object.remove(p1);
object.contains(name);
}
}


der eclipse will von mir dass ich hier :
Class clazz = Class.forName(args[0]);
AddressBookDataStore object = (AddressBookDataStore) clazz.newInstance();

try&catch block und/oder throws in die main methode einfüge. Also ich müsste eine Ausnahme behandeln. nur dann kann ich die Methoden des Interfaces
AddressBookDataStore
über
object
nicht mehr aufrufen, warum auch immer. habt ihr da Ideen, was ich tun kann?

danke!

Grüße,
Mel
08.04.2014
mel_forgotit 23 4
Das ist im Eclipse eigentlich eine Warnung, die kannst du einstellen.

Was dir passieren kann ist, eine ClassNotFoundException, die kannst du eigentlich auch werfen lassen über Throws.

Poste aber einfach mal dein Code mit dem Try-Catch Block, ich denke du hast die Variablenzuweisung ausserhalb der reichweite der Aufrufe.
Lord_Pinhead 08.04.2014
2 Antworten
2
Pass auf, du hast zwei möglichkeiten:

public class testklasse {
public static void main (String[] args) throws Exception {

Class clazz = Class.forName(args[0]);
AddressBookDataStore object = (AddressBookDataStore) clazz.newInstance();

String name = "Mustermann";
String prename = "Arda";
String vorname = "Michael";
String firstname = "Lisa";
Person2 p1 = new Person2(name, prename);
Person2 p2 = new Person2(name,vorname);
Person2 p3 = new Person2(name,firstname);
object.addPerson(p1);
object.addPerson(p1);
object.addPerson(p1);
object.getPersons(name);
object.remove(p1);
object.contains(name);
}
}

Hier wird irgendeine Exception geworfen, kann eine ClassNotFoundException sein oder eine NullPointer Exception.
Wenn ich Klassen Dynamisch Nachladen möchte wäre es ganz sinnvoll das doch abzufangen:

public class testklasse {
public static void main (String[] args) {

try {
Class clazz = Class.forName(args[0]);
AddressBookDataStore object = (AddressBookDataStore) clazz.newInstance();

String name = "Mustermann";
String prename = "Arda";
String vorname = "Michael";
String firstname = "Lisa";
Person2 p1 = new Person2(name, prename);
Person2 p2 = new Person2(name,vorname);
Person2 p3 = new Person2(name,firstname);
object.addPerson(p1);
object.addPerson(p1);
object.addPerson(p1);
object.getPersons(name);
object.remove(p1);
object.contains(name);
} catch (Exception e) {
// Logging der Exception und weitere Ausnahmebehandlungen
}
}
}


Wenn du nur die zwei Zeilen in einen Try-Catch-Block hast, kann später nicht mehr darauf zugegriffen werden da es in einer Unterfunktion (Try) eingeschlossen war. Also folgendes ist falsch:

public class testklasse {
public static void main (String[] args) {
try {
Class clazz = Class.forName(args[0]);
AddressBookDataStore object = (AddressBookDataStore) clazz.newInstance();
} catch (Exception e) {
// Mach was
}
String name = "Mustermann";
String prename = "Arda";
String vorname = "Michael";
String firstname = "Lisa";
Person2 p1 = new Person2(name, prename);
Person2 p2 = new Person2(name,vorname);
Person2 p3 = new Person2(name,firstname);
object.addPerson(p1);
object.addPerson(p1);
object.addPerson(p1);
object.getPersons(name);
object.remove(p1);
object.contains(name);
}
}


Die Variable object existiert nur im Try-Block. Was noch gehen könnte wäre:

public class testklasse {
public static void main (String[] args) {

Class clazz = null;
Object object = null;

try {
clazz = Class.forName(args[0]);
object = (AddressBookDataStore) clazz.newInstance();
} catch (Exception e {
// ausnahmebehandlung
}
// Rest wie gehabt
}
}


Letzteres ist allerdings unsauber finde ich.
Eine Ideallösung ist das Klassen Laden in eine Methode zu stecken und dort eine saubere Ausnahmebehandlung zu machen. Für einen Prototypen ist es zwar möglich nur mit einer Main zu arbeiten, ich würde es allerdings über Generics in eine Methode kapseln.
Schnell aus dem Kopf:

// Edit: Ich hab die Prüfung vergessen ob die Klasse mein AddressBookDataStore implementiert. Macht sie das kommt ein Object zurück sonst nur null. Möglich ist natürlich auch eine Exception zu werfen usw.
public static <T> T classloading( T klasse)
{
try {
if (klasse instanceof AddressBookDataStore)
return (AddressBookDataStore) Class.forName(klasse).newInstance();
} catch (Exception e) {
// Meine Ausnahmebehandlung
}
return null;
}
public static void main (String[] args) {
AddressBookDataStore object = classloading(args[0]);
if (object != null) {
// Code wie gehabt
} else {
// Es kam null zurück
}
}


Sorry für die Formatierung :-)
09.04.2014
Lord_Pinhead 778 1 8
+1 für die Mühe,die Du Dir gemacht hast. Trotzdem zwei Anmerkungen/Fragen:Try würde ich nicht als "Unterfunktion" bezeichnen,kann aber auch sein, das das nur in meinen Ohren komisch klingt.
Die eigentliche Frage ist, warum ich eine generische classloading Methode implementieren sollte, um jedes T auf AddressBookDataStore zu casten. Wolltest Du auf T casten? Beim Aufruf der Methode classloading im Beispiel übergibst Du einen String, damit wird Beispiel nie funktioneren. Du hast geschrieben, dass Du es schnell aus dem Kopf gemacht hast, aber solltest Du die Zeit finden,vlt. pimpst Du es noch :)
ffordermaier 09.04.2014
Ein guter Einwand ja. Wenn ich dem eine Klasse übergebe die nicht AddressBookDataStore implementiert, dann wird eine Exception geworfen. In dem Fall eben eine ClassCastException. Ändere ich mal ab ;-)

Was ein Try-Catch als "Unterfunktion" zu bezeichnen ist vielleicht etwas komisch, aber Programmtechnisch verhält es sich genauso als wenn ich es in eine Methode auslagern würde. Variablen die ich darin deklariere sind nur dort gültig usw. An sich ähnlich wie eine anonyme Funktion.
Lord_Pinhead 10.04.2014
0
hey Danke! Mir war nicht klar, dass ich für diese beiden Zeile und nicht nur für die obere davon
Class clazz = Class.forName(args[0]);
AddressBookDataStore object = (AddressBookDataStore) clazz.newInstance();
Ausnahmen werfen musste. jetzt ist klar.

Grüße,
Mel
09.04.2014
mel_forgotit 23 4

Stelle deine Java-Frage jetzt!