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) {
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) {
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 } }
+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 :)
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.
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.