ich hab mir über ein Array 10 Comboboxen erstellt. Wie kann ich am besten dafür die Actionlistner erzeugen.
Muss ich für jede Combobox einen eigenen Lister erstellen oder geht das auch gebündelt.
Ich habe schon einiges im Internet nachgelesen aber irgendwie komm ich damit nicht ganz klar.
Es gibt ja die möglichkeit etwas mit getSource zu machen. Das Ist wahrscheinlich genau das was ich brauche, aber ich verstehe nicht wie ich das anlegen muss.
so funktionieren wird, kann ich nicht sagen, ich hab mich noch nicht genau mit Comboboxen auseinandergesetzt, aber vom Verständnis her müsste es funktionieren. Probier es doch mal aus, das Adden geht auf jeden Fall so.
so funktionieren wird, kann ich nicht sagen, ich hab mich noch nicht genau mit Comboboxen auseinandergesetzt, aber vom Verständnis her müsste es funktionieren. Probier es doch mal aus, das Adden geht auf jeden Fall so.
ich hab das jetzt mal ausprobiert, leider führ das nicht zum gewünschten Ergebnis. Wenn ich den Listner mit in die Schleife packe, wird der doch nur aufgerufen wenn ich die "btn hinzufügen" Aktion ausführe oder?
ich hab das jetzt mal ausprobiert, leider führ das nicht zum gewünschten Ergebnis. Wenn ich den Listner mit in die Schleife packe, wird der doch nur aufgerufen wenn ich die "btn hinzufügen" Aktion ausführe oder?
Also was genau hast Du wir probiert? Und was genau ist das Ergebnis?
Generell wird beim Ausführen der Schleife auch die jeweilige Instanz von ActionListener erzeugt und damit steht das dann zur Verfügung.
Aber dein Code ist noch nicht wirklich nachvollziehbar - die Abläufe, wann Du was wie initialisierst sind mir derzeit nicht klar und das ganze Design sieht recht unglücklich aus.
Ich bin immer ein Fan von sauberem Design. Pack das zusammen, was zusammen gehört. Wenn also das, was Du in mbSchachtel und in cmbSchachtel hast, zusammen gehört, dann lass das auch irgendwie zusammen. Du kannst da objektorientiert gewisse Dinge bauen (dann hast Du da auch ein spezielles Verhalten und so... oder du kannst wenigstens die Daten so halten, dass Du gut darauf zugreifen kannst. Das könnte zur Not sogar eine einfache Map<Component,Component> sein. Dann würdest Du da halt die entsprechenden Paar hinzu fügen und könntest dann im ActionListener einfach darauf zu greifen.
Aber ich halte es für besser, das entsprechend objektorientiert anzugehen. Dann hast Du da eine "Schachtel" (Das war ja in den Variablen gleich) und da hast Du dann ein gewisses Verhalten. Incl. dem ActionListener, der dann mit dem anderen Control etwas macht...
Und um den Code lesbarer / kürzer zu gestalten, wäre mein Vorschlag auch, einmal Richtung Lambda oder Methodenreferenzen zu gehen um dieses new ActionListener() { ... } los zu werden ... Dazu muss man nicht tief einsteigen und hat schnell deutlich besseren Code (meiner Meinung nach).
Also was genau hast Du wir probiert? Und was genau ist das Ergebnis?
Generell wird beim Ausführen der Schleife auch die jeweilige Instanz von ActionListener erzeugt und damit steht das dann zur Verfügung.
Aber dein Code ist noch nicht wirklich nachvollziehbar - die Abläufe, wann Du was wie initialisierst sind mir derzeit nicht klar und das ganze Design sieht recht unglücklich aus.
Ich bin immer ein Fan von sauberem Design. Pack das zusammen, was zusammen gehört. Wenn also das, was Du in mbSchachtel und in cmbSchachtel hast, zusammen gehört, dann lass das auch irgendwie zusammen. Du kannst da objektorientiert gewisse Dinge bauen (dann hast Du da auch ein spezielles Verhalten und so... oder du kannst wenigstens die Daten so halten, dass Du gut darauf zugreifen kannst. Das könnte zur Not sogar eine einfache Map<Component,Component> sein. Dann würdest Du da halt die entsprechenden Paar hinzu fügen und könntest dann im ActionListener einfach darauf zu greifen.
Aber ich halte es für besser, das entsprechend objektorientiert anzugehen. Dann hast Du da eine "Schachtel" (Das war ja in den Variablen gleich) und da hast Du dann ein gewisses Verhalten. Incl. dem ActionListener, der dann mit dem anderen Control etwas macht...
Und um den Code lesbarer / kürzer zu gestalten, wäre mein Vorschlag auch, einmal Richtung Lambda oder Methodenreferenzen zu gehen um dieses new ActionListener() { ... } los zu werden ... Dazu muss man nicht tief einsteigen und hat schnell deutlich besseren Code (meiner Meinung nach).
Sauberes design finde ich Gut. wenn der Code nicht nachvollziehbar ist kann ich nätulich den ganzen Code reinstellen. Für Verbesserungen bin ich natürlich immer offen.
Java:
importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JMenuBar;importjavax.swing.JButton;importjavax.swing.JFileChooser;importjava.awt.event.ActionListener;importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.awt.Font;importjava.awt.event.ActionEvent;importjavax.swing.JTextField;importjavax.swing.filechooser.FileFilter;importjavax.swing.filechooser.FileNameExtensionFilter;importjavax.swing.JComboBox;importjavax.swing.Icon;importjavax.swing.ImageIcon;publicclassMainWindowextendsJFrameimplementsActionListener{privateJButton btnSchachtelLaden;privateJLabel lblSchachtel[]=newJLabel[10];privateJComboBox<String>[] cmbSchachtel =newJComboBox[10];privateJButton btnSchachtelHinzufügen;privateString path;privateString[]BoxcardName;//private ArrayList<String> SchachtelListe = new ArrayList<String>();privateBooleanShowUUID=false;//Variablen DeklartionprivateintSchachtelanzahl=1;publicMainWindow(){// Eigenschaften HauptfenstersetVisible(true);setTitle("Test Programm");setSize(1500,900);setLocationRelativeTo(null);System.out.println("Programm wurde gestartet");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);getContentPane().setLayout(null);
btnSchachtelHinzufügen =newJButton("Schachtel hinzufügen");
btnSchachtelHinzufügen.setBounds(24,120,400,30);getContentPane().add(btnSchachtelHinzufügen);
btnSchachtelLaden =newJButton("Datei laden");
btnSchachtelLaden.setBounds(24,11,171,36);getContentPane().add(btnSchachtelLaden);
lblSchachtel[0]=newJLabel("Schachtel Teil 1");
lblSchachtel[0].setBounds(24,45,646,30);getContentPane().add(lblSchachtel[0]);
lblSchachtel[1]=newJLabel("Schachtel Teil 2");
lblSchachtel[2]=newJLabel("Schachtel Teil 3");
lblSchachtel[3]=newJLabel("Schachtel Teil 4");
lblSchachtel[4]=newJLabel("Schachtel Teil 5");
lblSchachtel[5]=newJLabel("Schachtel Teil 6");
lblSchachtel[6]=newJLabel("Schachtel Teil 7");
lblSchachtel[7]=newJLabel("Schachtel Teil 8");
lblSchachtel[8]=newJLabel("Schachtel Teil 9");
lblSchachtel[9]=newJLabel("Schachtel Teil 10");
cmbSchachtel[0]=newJComboBox<String>();
cmbSchachtel[0].setBounds(24,73,477,36);
cmbSchachtel[0].addItem("Kein Verzeichnis ausgewählt");
cmbSchachtel[1]=newJComboBox<String>();
cmbSchachtel[2]=newJComboBox<String>();
cmbSchachtel[3]=newJComboBox<String>();
cmbSchachtel[4]=newJComboBox<String>();
cmbSchachtel[5]=newJComboBox<String>();
cmbSchachtel[6]=newJComboBox<String>();
cmbSchachtel[7]=newJComboBox<String>();
cmbSchachtel[8]=newJComboBox<String>();
cmbSchachtel[9]=newJComboBox<String>();getContentPane().add(cmbSchachtel[0]);getContentPane().validate();getContentPane().repaint();//************************************Actions******************************************
cmbSchachtel[0].addActionListener(this);
btnSchachtelHinzufügen.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvent e1){if(Schachtelanzahl< lblSchachtel.length-1){
lblSchachtel[Schachtelanzahl].setVisible(true);
lblSchachtel[Schachtelanzahl].setBounds(24,(45+(Schachtelanzahl)*60),(646),30);getContentPane().add(lblSchachtel[Schachtelanzahl]);try//Fehlerabfangen wenn noch keine Datei geladen wurde{BoxcardName=Schachteleinlesen(BoxcardName, path,".boxcard", cmbSchachtel[Schachtelanzahl],ShowUUID);}catch(Exception e4){
cmbSchachtel[Schachtelanzahl].addItem("Kein Verzeichnis ausgewählt");}
cmbSchachtel[Schachtelanzahl].setBounds(24,(73+(Schachtelanzahl)*60),477,36);
cmbSchachtel[Schachtelanzahl].addActionListener(this);
cmbSchachtel[Schachtelanzahl].addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvent e){System.out.println(cmbSchachtel[Schachtelanzahl].getSelectedItem());}});getContentPane().add(cmbSchachtel[Schachtelanzahl]);
btnSchachtelHinzufügen.setLocation(24,(120+(Schachtelanzahl)*60));//frame neu generierengetContentPane().validate();getContentPane().repaint();Schachtelanzahl++;if(Schachtelanzahl== lblSchachtel.length-1){
btnSchachtelHinzufügen.setEnabled(false);}}}});
btnSchachtelLaden.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvent e2){// Dateiverzeichnis auswählenJFileChooserFilesys=newJFileChooser(newFile("Z:\\boxdb_test\\boxpara\\"));Filesys.setMultiSelectionEnabled(true);Filesys.setDialogTitle("Verzeichnis Laden");System.out.println("Geöffnet");Filesys.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY );int returnVal =Filesys.showOpenDialog(null);//Beginn Fehlerabfrageif(returnVal ==JFileChooser.APPROVE_OPTION){File[] file =Filesys.getSelectedFiles();// Build array System.out.println(file.length);
path = file[0].getPath();deletArray(BoxcardName);System.out.println(path);for(int i =0; i <Schachtelanzahl; i++){
cmbSchachtel[i].removeAllItems();BoxcardName=Schachteleinlesen(BoxcardName, path,".boxcard", cmbSchachtel[i],ShowUUID);}System.out.println(BoxcardName[81]);System.out.println("Dialog geöffnet");}elseif(returnVal ==JFileChooser.CANCEL_OPTION){}elseif(returnVal ==JFileChooser.ERROR_OPTION){}}});}//********************************* Methoden*******************************************************// Array löschenpublicstaticvoid deletArray (String del[]){try{for(int i =0; i < del.length; i++)
del[i]=null;}catch(Exception e){System.out.println("leer");}}// Schachtel einlesenpublicString[]Schachteleinlesen(StringArray[],String path,StringFilter,JComboBox<String> cmb,Boolean UUID){File f =newFile(path);File[] l = f.listFiles();Array=newString[l.length+1];int y =1;Array[0]="keine Schachtel ausgewählt";
cmb.addItem(Array[0]);for(int i =1; i < l.length; i++){if(l[i].getName().contains(Filter)){if(UUID ==true){Array[y]= l[i].getName();System.out.println(Array[y]);
cmb.addItem(Array[y]);
y++;}else{Array[y]= l[i].getName();Array[y]=zerschnippel(Array[y],".");
cmb.addItem(Array[y]);
y++;}}}returnArray;}publicStringzerschnippel(String param,String lookAt){return param.substring(0,param.indexOf(lookAt));}@OverridepublicvoidactionPerformed(ActionEvent e){System.out.println(e.getSource());if(e.getSource()==this.cmbSchachtel[0]){System.out.println("geht doch");}elseif(e.getSource()==this.cmbSchachtel[1]){System.out.println("geht doch1");}}}
Also dann habe ich einfach mal Deinen Code kopiert und mal ein paar Änderungen vorgenommen:
a) Ich habe mal eine main Methode hinzugefügt mit einem einfachen new MainWindow()
Das aber nur zur Erläuterung - Du wirst das in einer anderen Klasse haben, was gut ist!
b) setVisible kommt ans Ende des Konstuktors - damit kann das validate und repaint weg. (Also immer erst am Ende sichtbar machen!)
c) implements ActionListener weg. actionPerformed kann dann umbenannt werden - aber keine Ahnung in was, den was macht die? testOutputAction habe ich mal genommen ... und dann da, wo this als ActionListener eingetragen war dann this::testOutputAction eingetragen (Methodenreferenz)
d) den new ActionListener bei btnSchachtelHinzufügen.addActionListener in eigene Methode gepackt: schachtelHinzufuegenAction und dann die Methoden-Referenz hinzugefügt.
e) Die Blöcke, die mehrere Controls erstellen, zu einer Schleife umgestellt.
f) Exception handling! Das ist absolut fahrlässig:
Java:
}catch(Exception e){System.out.println("leer");}
Und was für eine Exception möchtest Du in dem Code fangen?
Java:
for(int i =0; i < del.length; i++)
del[i]=null;
Wenn Du abfangen willst, dass del null ist, dann könnte (sollte) man das mit einem if machen.
e) Paar kleine Refactorings: Methoden fangen mit einem kleinen Buchstaben an, camelCase ...
Das waren nur ein paar kleine Aufwärm-Übungen. Nun kommen wir zu dem letzten ActionHandler - dem mit dem System.out.println(cmbSchachtel[Schachtelanzahl].getSelectedItem());
Da willst Du das ausgewählte Element von dem Control haben, das diese Auswahl getriggert hat. Das Element ist ja im Parameter mit vorhanden. Daher geht sowas:
f) boxcardName Array: Da Du ja ein neues Array erstellst musst Du das nicht erst leer machen. Und Du musst es auch nicht als Parameter übergeben ... Und das System.out.println(boxcardName[81]); führt natürlich auch schnell zu einem IndexOutOfBounds ...
Mit diesen Änderungen hat sich der Code etwas gewandelt (Ohne das Design jetzt wirklich anzupassen - das waren nur kleine Anpassungen des Codes....)
Java:
importjavax.swing.*;importjava.awt.event.ActionEvent;importjava.io.File;publicclassMainWindowextendsJFrame{privatefinalJButton btnSchachtelLaden;privatefinalJLabel[] lblSchachtel =newJLabel[10];privatefinalJComboBox<String>[] cmbSchachtel =newJComboBox[10];privatefinalJButton btnSchachtelHinzufügen;privateString path;privateString[] boxcardName;privatefinalBoolean showUUID =false;privateintSchachtelanzahl=1;publicstaticvoidmain(String[] args){newMainWindow();}publicMainWindow(){setTitle("Test Programm");setSize(1500,900);setLocationRelativeTo(null);System.out.println("Programm wurde gestartet");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);getContentPane().setLayout(null);
btnSchachtelHinzufügen =newJButton("Schachtel hinzufügen");
btnSchachtelHinzufügen.setBounds(24,120,400,30);getContentPane().add(btnSchachtelHinzufügen);
btnSchachtelLaden =newJButton("Datei laden");
btnSchachtelLaden.setBounds(24,11,171,36);getContentPane().add(btnSchachtelLaden);
lblSchachtel[0]=newJLabel("Schachtel Teil 1");
lblSchachtel[0].setBounds(24,45,646,30);getContentPane().add(lblSchachtel[0]);for(int i =1; i<=9; i++){
lblSchachtel[i]=newJLabel("Schachtel Teil "+(i+1));
cmbSchachtel[i]=newJComboBox<String>();}
cmbSchachtel[0]=newJComboBox<String>();
cmbSchachtel[0].setBounds(24,73,477,36);
cmbSchachtel[0].addItem("Kein Verzeichnis ausgewählt");getContentPane().add(cmbSchachtel[0]);
cmbSchachtel[0].addActionListener(this::testOutputAction);
btnSchachtelHinzufügen.addActionListener(this::schachtelHinzufuegenAction);
btnSchachtelLaden.addActionListener(this::schachtelLadenAction);setVisible(true);}publicstaticvoiddeleteArray(String[] del){for(int i =0; i < del.length; i++)
del[i]=null;}publicString[]schachtelEinlesen(String path,String filter,JComboBox<String> cmb,Boolean uuid){File f =newFile(path);File[] l = f.listFiles();String[] array =newString[l.length +1];int y =1;
array[0]="keine Schachtel ausgewählt";
cmb.addItem(array[0]);for(int i =1; i < l.length; i++){if(l[i].getName().contains(filter)){if(uuid ==true){
array[y]= l[i].getName();System.out.println(array[y]);
cmb.addItem(array[y]);
y++;}else{
array[y]= l[i].getName();
array[y]=zerschnippel(array[y],".");
cmb.addItem(array[y]);
y++;}}}return array;}publicStringzerschnippel(String param,String lookAt){return param.substring(0, param.indexOf(lookAt));}publicvoidtestOutputAction(ActionEvent e){System.out.println(e.getSource());if(e.getSource()==this.cmbSchachtel[0]){System.out.println("geht doch");}elseif(e.getSource()==this.cmbSchachtel[1]){System.out.println("geht doch1");}}publicvoidschachtelHinzufuegenAction(ActionEvent e1){if(Schachtelanzahl< lblSchachtel.length -1){
lblSchachtel[Schachtelanzahl].setVisible(true);
lblSchachtel[Schachtelanzahl].setBounds(24,(45+(Schachtelanzahl)*60),(646),30);getContentPane().add(lblSchachtel[Schachtelanzahl]);try//Fehlerabfangen wenn noch keine Datei geladen wurde{
boxcardName =schachtelEinlesen(boxcardName, path,".boxcard", cmbSchachtel[Schachtelanzahl], showUUID);}catch(Exception e4){
cmbSchachtel[Schachtelanzahl].addItem("Kein Verzeichnis ausgewählt");}
cmbSchachtel[Schachtelanzahl].setBounds(24,(73+(Schachtelanzahl)*60),477,36);
cmbSchachtel[Schachtelanzahl].addActionListener(this::testOutputAction);
cmbSchachtel[Schachtelanzahl].addActionListener(this::printSelectedItem);getContentPane().add(cmbSchachtel[Schachtelanzahl]);
btnSchachtelHinzufügen.setLocation(24,(120+(Schachtelanzahl)*60));//frame neu generierengetContentPane().validate();getContentPane().repaint();Schachtelanzahl++;if(Schachtelanzahl== lblSchachtel.length -1){
btnSchachtelHinzufügen.setEnabled(false);}}}publicvoidschachtelLadenAction(ActionEvent e2){// Dateiverzeichnis auswählenJFileChooserFilesys=newJFileChooser(newFile("Z:\\boxdb_test\\boxpara\\"));Filesys.setMultiSelectionEnabled(true);Filesys.setDialogTitle("Verzeichnis Laden");System.out.println("Geöffnet");Filesys.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);int returnVal =Filesys.showOpenDialog(null);//Beginn Fehlerabfrageif(returnVal ==JFileChooser.APPROVE_OPTION){File[] file =Filesys.getSelectedFiles();// Build arraySystem.out.println(file.length);
path = file[0].getPath();System.out.println(path);for(int i =0; i <Schachtelanzahl; i++){
cmbSchachtel[i].removeAllItems();
boxcardName =schachtelEinlesen(path,".boxcard", cmbSchachtel[i], showUUID);}// System.out.println(boxcardName[81]);System.out.println("Dialog geöffnet");}elseif(returnVal ==JFileChooser.CANCEL_OPTION){}elseif(returnVal ==JFileChooser.ERROR_OPTION){}}publicvoidprintSelectedItem(ActionEvent e){if(e.getSource()instanceofJComboBox){JComboBox<String> comboBox =(JComboBox) e.getSource();System.out.println(comboBox.getSelectedItem());}}}
Das aber einfach nur um ein paar Kleinigkeiten zu zeigen in der Hoffnung, dass es etwas hilft. Mir ist bewusst, dass dieses kurze "Friß oder stirb" mit fertigen Anpassungen hinwerfen nicht wirklich tauglich ist. Aber die kurzen Anmerkungen reichen hoffentlich, um dann mehr Erläuterung im Netz zu finden. Ansonsten einfach mal nachfragen, wir erläutern dann noch etwas mehr ...
a) Ich habe mal eine main Methode hinzugefügt mit einem einfachen new MainWindow()
Das aber nur zur Erläuterung - Du wirst das in einer anderen Klasse haben, was gut ist!
b) setVisible kommt ans Ende des Konstuktors - damit kann das validate und repaint weg. (Also immer erst am Ende sichtbar machen!) Das macht Sinn, ich hatte Probleme mit der Darstellung nachdem ein Button hinzugefügt worden ist.
c) implements ActionListener weg. actionPerformed kann dann umbenannt werden - aber keine Ahnung in was, den was macht die? testOutputAction habe ich mal genommen ... und dann da, wo this als ActionListener eingetragen war dann this::testOutputAction eingetragen (Methodenreferenz) Das ist erstmal nur das Grundgerüst, wenn ich weiss welcher Eintrag ausgewählt wurde will ich Daten aus einem Json file laden. (Das wird die nächste Baustelle). Die Geschichte mit der Methodenreferenz ist mir noch nicht ganz klar.
d) den new ActionListener bei btnSchachtelHinzufügen.addActionListener in eigene Methode gepackt: schachtelHinzufuegenAction und dann die Methoden-Referenz hinzugefügt.
e) Die Blöcke, die mehrere Controls erstellen, zu einer Schleife umgestellt. Ja, da wollte ich auch eine Schleife raus machen. Ich hatte die erzeugung zuerst in der Action Button hinzufügen das funktionierte auch soweit, aber dann kamm das Problem mit dem Listner. Aber ich glaube die Erzeugung am Anfang zu machen ist deutlich übersichtlicher.
f) Exception handling! Das ist absolut fahrlässig: Mir ist nicht ganz klar warum das Fahrlässig ist. Ich möchte damit einen null eintrag verhinden. Ich dachte dafür ist die Try catch bedingung.
e) Paar kleine Refactorings: Methoden fangen mit einem kleinen Buchstaben an, camelCase ... Ja, da war mal was in der Schule...
Die Instanceof Geschichte sieht gut aus und ist gut verständlich.
f) boxcardName Array: Da Du ja ein neues Array erstellst musst Du das nicht erst leer machen. Und Du musst es auch nicht als Parameter übergeben ... Und das System.out.println(boxcardName[81]); führt natürlich auch schnell zu einem IndexOutOfBounds ...
Meinst du diese Teil?
Java:
for(int i =0; i <Schachtelanzahl; i++){
cmbSchachtel[i].removeAllItems();
boxcardName =schachtelEinlesen(path,".boxcard", cmbSchachtel[i], showUUID);}
Theortisch muss ich nur einmal ein Verzeichnis auswählen. das mach ich wahscheinlich auch noch anders.
Ich hatte mir das so gedacht, wenn ich später nochmal das verzeichnis ändere lösche ich alle Daten für die Comboboxen und schreibe anschließend die neuen einträge.
Nocheinmal einen Großes Dankeschön für die Hinweise. Ich glaube da hilft echt weiter. Die große frage ist ja immer wie komme ich sauber und geschickt zum Ziel. Leider fehlt mir noch eine Menge Syntax. Aber das wird bestimmt mit der Zeit besser.
f) Exception handling! Das ist absolut fahrlässig: Mir ist nicht ganz klar warum das Fahrlässig ist. Ich möchte damit einen null eintrag verhinden. Ich dachte dafür ist die Try catch bedingung.
Wenn Dein Programm in ein Problem rennt, dann möchtest Du doch dieses Problem abstellen können. Daher solltest Du dafür sorgen, dass Du immer die Informationen bekommst, die Du benötigst.
Bei Exceptions sind aber zwei Dinge zu unterscheiden:
a) Zur Laufzeit passiert etwas unerwartetes - Das ist blöd und da muss man dann irgendwie reagieren oder das Problem nur an den Anwender kommunizieren, damit dieser es abstellen kann. ==> Dafür ist das catch da!
b) Der Entwickler macht etwas falsch. Die NPE (NullPointerException) ist das beste Beispiel dafür. Hier willst Du nicht die Exception abfangen sondern Du willst dein Programm umschreiben, so dass der Fehler nicht mehr vorhanden ist.
Da kann dann z.B. ein einfaches if (whatever == null) als Check ausreichend sein. Bei der deleteArray Methode könnte man einfach zurück gehen also ein return in dem Fall machen. Oder man gibt vor, dass es nicht null sein darf - dann wirft man eine Exception und Du musst beim Aufruf deinen Code anpassen!
Das fahrlässige kommt aber aus 2 Gründen:
- Du fängst alle Exceptions - wer weiß, was da mit der Zeit hinterher noch im try Block alles gemacht wird ...
- Du gibst wichtige Daten nicht aus. Du bekommst also nicht mit, dass es eine Exception gab und kannst daher Fehler nicht beheben.
Wenn Du so Exceptions fängst, dann immer ausgeben. Also immer etwas wie:
Java:
catch(WhateverException ex){System.err.println("Exception when doing something: "+ ex.getMessage());
ex.printStackTrace(System.err);}
Und wenn Du da NPE siehst, dann immer schauen: Wo wurde diese ausgelöst? Und was muss im Programm angepasst werden, um damit umgehen zu können...
Die große frage ist ja immer wie komme ich sauber und geschickt zum Ziel. Leider fehlt mir noch eine Menge Syntax. Aber das wird bestimmt mit der Zeit besser.
Einfach weiter probieren und versuchen Praxis zu bekommen. Ideal ist immer ein Mentor/Tutor, der einen unterstützt, aber wenn Du regelmäßig hier im Forum bist mit Code, dann kommen viele Hinweise auch so.
Da vielleicht auch noch zur Einordnung: Das sind Hinweise, die helfen sollen. Und bei Code verwende ich gerne deutliche Worte, wie "fahrlässig" und so. Das richtet sich aber nicht gegen Dich - Du bist dabei etwas zu lernen und das ist super und da kann so ein Code eine gute Leistung sein! Daher auf keinen Fall entmutigen lassen - die Hinweise sollen nur helfen.