Errorhandling

chrismass

Mitglied
Hallo zusammen!

Ich entwickle gerade ein User Interface welches (unter anderem) eine Tabelle mit Projektdaten enthält. Diese Tabelle habe ich als eigene Klasse ausgegliedert. In der Klasse "EdView" wird also eine Instanz von "ProjectTable" erzeugt.
Zum löschen von Projekten aus der Tabelle habe ich nun die Methode "deleteProject()" geschrieben. Sie soll das aktuell in der Tabelle markierte Projekt löschen (wobei nur single selection erlaubt ist).
Bei Programmstart ist nun in der Tabelle noch nichts markiert. Drückt der Benutzer auf "delete" ohne eine Zeile zu markieren, bekomme ich natürlich eine "IndexOutOfBounds Exception".

So, nun zur eigentlichen Frage.
Wie, und wo behandele ich denn am besten diesen Error? Ich habe momentan ein try-catch in der Methode deleteProject in der Klasse "ProjectTable" eingebaut. Ich möchte aber auch ein visuelles Feedback an den Benutzer zurückgeben (Dialogfenster mit Meldung).

Könnte ich (oder wäre es besser?) den Fehler auch durch try-catch in der Klasse "EdView" abzufangen und dann im catchblock ein Dialogfenster zu erzeugen?
Ich habe damit noch nicht viel Erfahrung. Sicherlich gibt es mehrere Möglichkeiten so etwas anzugehen?
(eventuell eigene Error-Handler-Klassen ? )

Für eine kleine Lehrstunde bedanke ich mich schon mal im Vorraus ;-)

Hier mal die entsprechenden Stellen aus dem Code :

Java:
public class EdView implements ActionListener{

DeleteProjectButton deleteProject = new DeleteProjectButton();
deleteProject.setActionCommand("delProj");
deleteProject.addActionListener(this);

...
ProjectTable projectTable = new ProjectTable(client);
...
rightPanel.add(projectTable);
...

   public void actionPerformed(ActionEvent e) {
	    if ("newProj".equals(e.getActionCommand())) {
	        eventNewProject();
	    	//mode = appMode.PROJECTEDIT;
	        //setUserInterface(mode);
	    } 
	    if ("delProj".equals(e.getActionCommand())){
	    	projectTable.deleteData();
	    }
   }
...

}

##########
und hier die Klasse ProjectTable:

Java:
public class ProjectTable extends JPanel{
	
	private MyClient client;
	private JTable edProjectTable;
	private JScrollPane scrollPane;
	DefaultTableModel tabModel;
	Object[] columnNames = new Object [] {"Autor","Titel","ID"};
	
	public ProjectTable(MyClient c){
		
		.....

	
		
	}
	
	public String getData(){
		...
	}
	
	public int deleteData(){
		try {
			System.out.println(edProjectTable.getSelectedRow());
			System.out.println(edProjectTable.getValueAt(edProjectTable.getSelectedRow(), 2));
			String[] data =new String[] {(String)edProjectTable.getValueAt(edProjectTable.getSelectedRow(), 2)};
			client.call("delProject",data);
			tabModel.removeRow(edProjectTable.getSelectedRow());
		} catch (IndexOutOfBoundsException iobe) {
			// TODO: handle exception
			System.err.println("nothing selected!");
			iobe.printStackTrace();
			
		}
		
	}
	
	public void update(){
		...
	}

}
 

xanadoo

Erfahrenes Mitglied
Ich denke, die visuelle Ausgabe kannst du am Einfachsten mit einer JOptionPane machen.

Ich fände es auch schöner, wenn erst gar keine Exception geworfen würde.
Du kannst ja prüfen, ob getSelectedRow -1 zurück gibt.
Wenn ja, zeigst du die JOptionPane an, wenn nein löscht du die Zeile mit dem erhaltenen Index.
 

chrismass

Mitglied
Danke !
Ich habs jetzt so gelöst:

Java:
public void deleteData(){	
		System.out.println("Selected Row: "+edProjectTable.getSelectedRow());
		//System.out.println(edProjectTable.getValueAt(edProjectTable.getSelectedRow(), 2));
		
		if(edProjectTable.getSelectedRow() == -1){
			JOptionPane.showMessageDialog(EdminApp.getApplication().getMainFrame(), "Nichts ausgewählt! \n" +
					"																Wählen Sie bitte zuerst das zu löschende Projekt aus.", "Fehler", JOptionPane.ERROR_MESSAGE);
		}
		
		else{
			String[] data =new String[] {(String)edProjectTable.getValueAt(edProjectTable.getSelectedRow(), 2)};
			try{
			client.getRpcClient().call("delProject",data);
			tabModel.removeRow(edProjectTable.getSelectedRow());
			}
			catch(NullPointerException npe){
				JOptionPane.showMessageDialog(EdminApp.getApplication().getMainFrame(), "Projekt nicht vorhanden! \n" +
						"																Das Projekt mit der ID \""+edProjectTable.getValueAt(edProjectTable.getSelectedRow(), 2)+"\" " +
								"														\nwurde auf dem Server nicht gefunden. \nBitte wenden Sie sich an Ihren Administrator.", "Fehler", JOptionPane.ERROR_MESSAGE);
			}
		}
	}

Das dürfte in etwa dem entsprechen, was du vorgeschlagen hast.
 

Neue Beiträge