# Problem mit dem ActionListener und SQL Exception



## MASTERmind (28. Apr 2005)

Hallo nochmal!

Bisher hat das mit den Action Listenern immer ganz gut geklappt in JFrames

Jetzt, da ich eine SQL Datenbank abfrage gehts nicht mehr.

es kommt die fehlermeldung:

overriden method does not throw java sql exception.

Ich muß diese Exception aber doch irgendwie abfangen können und den Event auslösen können.


```
import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Finanzanalyse extends JFrame implements ActionListener
{
 JTextArea displayArea;
 JLabel header;
 JButton connect;
 
 private Container con;
 
 public Finanzanalyse()
 {
  super("Daten aus der Datenbank saugen ...");
  con = getContentPane();

  connect = new JButton("saugen ");
  
  displayArea = new JTextArea("TestString................");
  header = new JLabel("Daten Anzeige");
  displayArea.add(header);
  
  JPanel layoutPanel = new JPanel();
  layoutPanel.setLayout( new BoxLayout( layoutPanel, BoxLayout.Y_AXIS) );
  layoutPanel.add(connect);
  layoutPanel.add(displayArea);
  
  con.add(layoutPanel);
  connect.setActionCommand("saugen");
  connect.addActionListener(this);
 }
 
  public void actionPerformed(ActionEvent e) throws SQLException, ClassNotFoundException // <==
  {
   if(e.getActionCommand().equals("saugen")) datenSaugenMethode(); // <==
  
  }
 
 
 
 public void datenSaugenMethode()throws SQLException, ClassNotFoundException
 {
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  String url = "jdbc:odbc:PostgreSQL";
  Connection con = DriverManager.getConnection(url, "user", "passwort");
  
  PreparedStatement st = con.prepareStatement("Select Umsatz from finanzdaten");
  
  ResultSet rs = st.executeQuery();
  int numCols = rs.getMetaData().getColumnCount();
  
  while(rs.next())
  {
   for(int j = 1; j <= numCols; j++)
   {
            System.out.print(rs.getString(j) + "");
            System.out.println();
   }
   rs.close();
   st.close();
   con.close();
  }
 }

 public static void main(String args[]) throws SQLException, ClassNotFoundException
 {
  Finanzanalyse app = new Finanzanalyse();
  app.setDefaultCloseOperation(EXIT_ON_CLOSE);
  app.setSize(300,300);
  app.setVisible(true);
 }
}
```


----------



## Guest (28. Apr 2005)

In welcher Zeile denn.
Du hast ja mehrere "throws SQLException" Anweisungen.


----------



## MASTERmind (28. Apr 2005)

da wo die pfeile sind

ab 37


----------



## molotov (28. Apr 2005)

actionPerformed im Interface ActionListener wirft keine Exceptions, also darf es die Methode in der überschreibenden Klasse auch nicht. Die Exceptions müssten also wohl irgendwo vorher behandelt werden, wenns überhaupt nicht anders geht halt irgendeine RuntimeException oder so weiterwerfen...


----------



## Guest (28. Apr 2005)

Bin mir nicht sicher, aber es könnte sein, weil Du die Anweisung in einer If-Anweisung stehen hast.
Also wird die Anweisung ja nicht immer ausgeführt und somit ist es nicht zwangsläufig der Fall, das eine SQLException geworfen wird.

Ist aber nur ne Vermutung, wissen tu ich es nicht.


----------



## MASTERmind (28. Apr 2005)

@molotov

könntest du ein wenig genauer werden, wie das auszusehen hat???


----------



## molotov (28. Apr 2005)

Ungefähr so (Achtung, ungetestet!):


```
public void actionPerformed(ActionEvent e) {

    if(e.getActionCommand().equals("saugen")) {
        try {
            datenSaugenMethode();
        } catch (SQLException e) {
            // irgendwas sinnvolles machen, z.B. Fehlermeldung anzeigen
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}
```

Im zweiten catch wird die Exception einfach weitergeworfen, aber "unchecked" - wenn man das nicht irgendwo später noch behandelt also recht unschön.

[edit]Evtl. wärs natürlich schöner, die Exceptions schon in datenSaugenMethode zu behandeln...[/edit]


----------

