'IOException must be caught or declared' - was tun?

Surras

Mitglied
Hi ich habe folgendes Problem:

Ich habe mir ein kleines Programm zum testen mit grafischer Oberfläche mittels Swing im Java-Editor zusammen geklickt. Es ist quasi ein kleines Programm in dem man Datenbankmäßig Personaldaten abspeichern kann. Es soll daten in eine ".txt"-Datei schreiben um es dauerhaft zu speichern und aus dieser auch wieder lesen können.

Leider macht es das nicht ganz. Es taucht immer die Meldung
Java:
Compiliere C:\Users\...\personal.java mit Java-Compiler
personal.java:149:36: unreported exception java.io.IOException; must be caught or declared to be thrown
        save_button_ActionPerformed(evt);
                                   ^
1 error

Nun ist die Frage was ich dagegen machen kann ^^" aktuell sieht das ganze so aus:

Java:
/*[...]*/
 public void save_button_ActionPerformed(ActionEvent evt) throws IOException {

    name = enter_name.getText();
    vorname = enter_vorname.getText();
    strasse = enter_strasse.getText();
    plz = enter_plz.getText();
    stadt = enter_stadt.getText();
    abteilung = enter_abteilung.getText();
    String n = System.getProperty("line.separator");
    
    liste.setText("Speichern erfolgreich!\n" + "Speicherung in Datensatz: 1\n\n"
    );
    
    File data = new File ("data.txt");
    FileWriter write = new FileWriter(data, true);
    write.write(name + n + vorname + n + strasse + n + plz + n + stadt + n +
    abteilung + n);
    erase();
    write.close();
  }
/*[...]*/


Es sollen also Strings gespeichert werden wie name, vorname, straße, usw. und diese dann ablegen.
Wo liegt also das Problem? :bahnhof:

Desweiteren noch eine andere Sache: was habe ich noch für möglichkeiten Strings, daten, etc. in einer Datei abzulegen und diese "eleganter" und sicherer abzuspeichern? (ich mein .txt is ja editierbar usw.)
 
try{
File data = new File ("data.txt");
FileWriter write = new FileWriter(data, true);
write.write(name + n + vorname + n + strasse + n + plz + n + stadt + n +
abteilung + n);
erase();
write.close();
}
catch(IOException ioexp){printf("Fehler");}
 
habe es jetzt mit dem try-catch versucht, leider kommt aber immer noch die selbe fehlermeldung 🙁

Java:
 public void save_button_ActionPerformed(ActionEvent evt) throws IOException {

    name = enter_name.getText();
    vorname = enter_vorname.getText();
    strasse = enter_strasse.getText();
    plz = enter_plz.getText();
    stadt = enter_stadt.getText();
    abteilung = enter_abteilung.getText();
    String n = System.getProperty("line.separator");
    
    liste.setText("Speichern erfolgreich!\n" + "Speicherung in Datensatz: 1\n\n"
    );

    try{
    File data = new File ("data.txt");
    FileWriter write = new FileWriter(data, true);
    write.write(name + n + vorname + n + strasse + n + plz + n + stadt + n +
    abteilung + n);
    erase();
    write.close();
    }
    catch(IOException ioexp){liste.setText("Fehler beim Speichern!");}
  }

@SlaterB: Ich hatte mich auch durch das Galileo-Buch durchgewühlt, da ziehe ich eigentlich erst meine infos her, danach google und dann das Forum ^^

aber ich muss es wohl echt irgendwo überlesen haben das problem :/

Mit dem Try-Catch funkt es aber leider immer noch nicht :/ Wenn es nötig ist, kann ich auch gern mal den ganzen Quelltext veröffentlichen.
 
sieht soweit relativ gut aus, wobei jedem anderen Menschen natürlich 70% aller Informationen verheimlich sind,
wenn liste.setText() auch die Exception wirft.., ist aber nicht so wahrscheinlich,

was ist denn aktuell das Problem? achso, in Zeile 1 muss natürlich 'throws IOException' weg
 
Entweder entfernst du das "thows IOException" oder du musst den methodenaufruf deiner save_button_ActionPerformed-Methode ebenfalls in einen try-catch-Block setzen, was aber deutlich umständlicher ist.
 
ah wunderbar, durch das wegnehmen des 'throws IOException' hat es geklappt.

Ich hatte bei google ein Beispiel gefunden (link) und es auch vorher mit einem Beispiel ausprobiert, wo es mit dem trhows geklappt(*edit) hatte und dachte es funktioniert hier genauso 😳

Dann muss ich doch mal ganz vorsichtig Fragen: wozu ist denn das 'throws' überhaupt da, bzw. wo verwendet man dies denn?
 
6.1.7 throws im Methodenkopf angeben

Neben der rahmenbasierten Ausnahmebehandlung – dem »Einzäunen« von problematischen Blöcken durch einen try- und catch-Block – gibt es eine weitere Möglichkeit, auf Exceptions zu reagieren: Weiterleiten an den Aufrufer [..]
sauberst-möglich aufgeschrieben, bei Unverständnis sind Nachfragen erlaubt,

aber nein, durch Lehrbücher wühlt man ja nur und schreibt dann im Forum man hat gewühlt, weiß aber nix, bitte nochmal erklären..
 
Slater hat es schon teilweiße erwähnt, aber um es nochmal deutlich zu sagen:
liste.setText("Fehler beim Speichern!");
Mache so etwas NIEMALS.

So weißt einerseits du nicht, wodurch die Exception fliegt, andererseits kann ein anderer Anwender dir ebenfalls noch viel weniger darüber sagen. Bspw. wird der Systemtray in ein paar Linux Dists nicht gesupportet, wenn da nur irgend eine unspezifische Fehlermeldung ausgegeben wird, weiß keiner was eigendlich los ist.

Exceptions sind wohl das Beste, was dir überhaupt passieren kann. Der Bug ist da, (wobei Exceptions auch alltägliche Dinge wie z. B. gespeerte Dateien, oder wenn du versuchst mit dem FileReader in ein Verzeichnis zu schreiben ausgeben können), ob du die Exception nun siehst oder nicht. Aber sie sagen dir i. d. R. genau, was los ist und wo im Code etwas los ist, wodurch du es einfach fixen kannst. Wenn du keine Ahnung hast, wodurch die Exception fliegt, wirst du die Ursache auch nur sehr schwer beheben können.
 
aww, das hatte ich nicht gefunden, bzw. "überlesen" ¬_¬ 😳
Nagut danke für den Tipp ^^ heisst ich muss also noch vieel intensiver an den Lehrbüchern kauen :rtfm:

Danke für die Hilfe. Mein Problem wurde ja erledigt. :toll:
 
@Volvagia
das sehe ich nicht unbedingt so,
ein leerer catch-Block wäre schlecht, dieser hier könnte zumindest funktionieren wenn liste (ein übel benanntes TextFeld?) nicht ganz in der GUI fehlt,

die Fehlermeldung muss hier nicht gleich perfekt sein,
der Code sieht nicht nach IOException aus (einen ersten erfolgreichen Durchlauf wird man sich ja eh anschauen),
möglicherweise tritt nie einer auf oder bis dahin sind liste & Co. schon 3x umgebaut,
wahrscheinlich passiert eh nix, wenn man das an 10 Stellen so baut und eine irgendwann Probleme macht, muss man die eh genauer anschauen,
das lohnt nicht unbedingt komplizierte Transformierung des StackTrace in das GUI-TextFeld oder ähnliches,

printStackTrace() kann man natürlich einfach so hinschreiben wenn man möchte, aber genauso gut bei genauerer Untersuchung ergänzen wenn man weiß was es ist
 
Stimmt auch wieder. Wobei ich meistens schon von Anfang an aufpasse und nach dem ersten erfolgreichen Durchlauf so lasse, wenn es sich nicht um eine Kernklasse handelt.
Ich weiß nicht, ob du den Thread vor kurzem gesehen hast. Dort wurde eine simple NPE gefangen und es hat schon etwas gedauert, bis der Fehler gefixt wurde. Zumindest hat niemand mehr etwas geschrieben, weiß garnicht was dort passiert ist. ^^ Finde ihm nicht mehr.
 
...
@Volvagia
das sehe ich nicht unbedingt so,
ein leerer catch-Block wäre schlecht, dieser hier könnte zumindest funktionieren wenn liste (ein übel benanntes TextFeld?) nicht ganz in der GUI fehlt,

...

nunja also es ist wirklich ein übel benanntest JTextArea ^^"
wie ich schon oben geschrieben hatte, ist der Code größtenteils durch den Swing-Builder im Java-Editor entstanden (und der ist ja bekanntlich nicht der perfekteste *g*)

zum verständnis pack ich ihn jetzt hier mal rein das man sieht, was denn da genau passieren sollte usw.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 14.04.2011
  * @author
  */

public class personal extends JFrame {
  // Anfang Attribute
  
  private String name;
  private String vorname;
  private String strasse;
  private String plz;
  private String stadt;
  private String abteilung;
  
  private JPanel button_panel = new JPanel(null);
    private JLabel suche_label = new JLabel();
    private JButton button_exit = new JButton();
    private JTextField suche_name = new JTextField();
    private JLabel suche_name_label = new JLabel();
    private JLabel suche_adresse_label = new JLabel();
    private JTextField suche_adresse = new JTextField();
    private JLabel suche_abteilung_label = new JLabel();
    private JTextField suche_abteilung = new JTextField();
    private JTextArea help_text = new JTextArea("");
    private JButton button_suche = new JButton();
  private JPanel eingabe_panel = new JPanel(null);
    private JLabel name_label = new JLabel();
    private JTextField enter_name = new JTextField();
    private JTextField enter_vorname = new JTextField();
    private JLabel vorname_label = new JLabel();
    private JLabel adresse_label = new JLabel();
    private JLabel plz_label = new JLabel();
    private JTextField enter_strasse = new JTextField();
    private JLabel stadt_label = new JLabel();
    private JNumberField enter_plz = new JNumberField();
    private JTextField enter_stadt = new JTextField();
    private JLabel abteilung_label = new JLabel();
    private JTextField enter_abteilung = new JTextField();
    private JButton verwerfen_button = new JButton();
    private JButton save_button = new JButton();
  private JPanel ausgabe_panel = new JPanel(null);
    private JScrollPane jScrollPane1 = new JScrollPane();
      private JTextArea liste = new JTextArea("");
  private JLabel neu_label = new JLabel();
  // Ende Attribute

  public personal(String title) {
    // Frame-Initialisierung
    setLayout(new BorderLayout());


    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 758;
    int frameHeight = 409;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    button_panel.setBounds(0, 0, 185, 369);
    cp.add(button_panel);
    eingabe_panel.setBounds(192, 32, 545, 201);
    cp.add(eingabe_panel);
    ausgabe_panel.setBounds(192, 240, 545, 129);
    cp.add(ausgabe_panel);
    suche_label.setBounds(64, 8, 61, 16);
    suche_label.setText("Suche");
    suche_label.setFont(new Font("MS Sans Serif", Font.BOLD + Font.ITALIC, 13));
    button_panel.add(suche_label);
    button_exit.setBounds(40, 328, 91, 25);
    button_exit.setText("Beenden");
    button_exit.setMargin(new Insets(2, 2, 2, 2));
    button_exit.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button_exit_ActionPerformed(evt);
      }
    });
    button_panel.add(button_exit);
    name_label.setBounds(8, 16, 50, 16);
    name_label.setText("Name:");
    name_label.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    eingabe_panel.add(name_label);
    enter_name.setBounds(88, 12, 433, 24);
    enter_name.setText("");
    eingabe_panel.add(enter_name);
    enter_vorname.setBounds(88, 36, 433, 24);
    enter_vorname.setText("");
    eingabe_panel.add(enter_vorname);
    vorname_label.setBounds(8, 40, 68, 16);
    vorname_label.setText("Vorname:");
    vorname_label.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    eingabe_panel.add(vorname_label);
    adresse_label.setBounds(8, 64, 53, 16);
    adresse_label.setText("Straße:");
    adresse_label.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    eingabe_panel.add(adresse_label);
    plz_label.setBounds(8, 88, 81, 16);
    plz_label.setText("Postleitzahl:");
    plz_label.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    eingabe_panel.add(plz_label);
    enter_strasse.setBounds(88, 60, 433, 24);
    enter_strasse.setText("");
    eingabe_panel.add(enter_strasse);
    stadt_label.setBounds(8, 112, 44, 16);
    stadt_label.setText("Stadt:");
    stadt_label.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    eingabe_panel.add(stadt_label);
    enter_plz.setBounds(88, 84, 433, 24);
    enter_plz.setText("");
    eingabe_panel.add(enter_plz);
    enter_stadt.setBounds(88, 108, 433, 24);
    enter_stadt.setText("");
    eingabe_panel.add(enter_stadt);
    abteilung_label.setBounds(8, 136, 69, 16);
    abteilung_label.setText("Abteilung:");
    abteilung_label.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    eingabe_panel.add(abteilung_label);
    enter_abteilung.setBounds(88, 132, 433, 24);
    enter_abteilung.setText("");
    eingabe_panel.add(enter_abteilung);
    verwerfen_button.setBounds(440, 168, 75, 25);
    verwerfen_button.setText("verwerfen");
    verwerfen_button.setMargin(new Insets(2, 2, 2, 2));
    verwerfen_button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        verwerfen_button_ActionPerformed(evt);
      }
    });
    eingabe_panel.add(verwerfen_button);
    save_button.setBounds(360, 168, 75, 25);
    save_button.setText("speichern");
    save_button.setMargin(new Insets(2, 2, 2, 2));
    save_button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        save_button_ActionPerformed(evt);
      }
    });
    eingabe_panel.add(save_button);
    neu_label.setBounds(200, 8, 201, 16);
    neu_label.setText("Neuen Mitarbeiter anlegen");
    neu_label.setFont(new Font("MS Sans Serif", Font.BOLD + Font.ITALIC, 13));
    cp.add(neu_label);
    suche_name.setBounds(8, 52, 121, 24);
    suche_name.setText("");
    suche_name.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        suche_name_ActionPerformed(evt);
      }
    });
    button_panel.add(suche_name);
    suche_name_label.setBounds(8, 32, 115, 16);
    suche_name_label.setText("Name / Vorname:");
    suche_name_label.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    button_panel.add(suche_name_label);
    suche_adresse_label.setBounds(8, 80, 125, 16);
    suche_adresse_label.setText("Straße / PLZ / Stadt");
    suche_adresse_label.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    button_panel.add(suche_adresse_label);
    suche_adresse.setBounds(8, 97, 121, 24);
    suche_adresse.setText("");
    suche_adresse.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        suche_adresse_ActionPerformed(evt);
      }
    });
    button_panel.add(suche_adresse);
    suche_abteilung_label.setBounds(8, 126, 66, 16);
    suche_abteilung_label.setText("Abteilung");
    suche_abteilung_label.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    button_panel.add(suche_abteilung_label);
    suche_abteilung.setBounds(8, 146, 121, 24);
    suche_abteilung.setText("");
    suche_abteilung.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        suche_abteilung_ActionPerformed(evt);
      }
    });
    button_panel.add(suche_abteilung);
    help_text.setBounds(8, 232, 169, 81);
    help_text.setText("Um nach einem Mitarbeiter zu \nsuchen, gebe einfach den \ngesuchen Namen, Vornamen, \nAdresse oder die Abteilung \nein.");
    help_text.setLineWrap(false);
    help_text.setFont(new Font("MS Sans Serif", Font.PLAIN, 12));
    help_text.setForeground(Color.GRAY);
    button_panel.add(help_text);
    jScrollPane1.setBounds(0, 0, 521, 129);
    ausgabe_panel.add(jScrollPane1);
    liste.setBounds(14, 14, 209, 57);
    liste.setText("");
    liste.setLineWrap(true);
    jScrollPane1.setViewportView(liste);
    liste.setEditable(false);
    button_suche.setBounds(47, 192, 75, 25);
    button_suche.setText("Suche");
    button_suche.setMargin(new Insets(2, 2, 2, 2));
    button_suche.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button_suche_ActionPerformed(evt);
      }
    });
    button_panel.add(button_suche);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden

  public void erase () {
    enter_name.setText("");
    enter_vorname.setText("");
    enter_strasse.setText("");
    enter_plz.setText("");
    enter_stadt.setText("");
    enter_abteilung.setText("");
  }

  public void ausgabe(){
     liste.setText("");
     liste.append("Suche Erfolgreich! Datensatz: 1\n\n" +
     "Name: " + name + "\n" +
     "Vorname: " + vorname + "\n" +
     "Straße: " + strasse + "\n" +
     "Postleitzahl: " + plz + "\n" +
     "Stadt: " + stadt + "\n" +
     "Abteilung: " + abteilung);
  }


  public void button_exit_ActionPerformed(ActionEvent evt) {
   System.exit(0);
  }


  public void verwerfen_button_ActionPerformed(ActionEvent evt) {
     erase();

  }

  public void save_button_ActionPerformed(ActionEvent evt) {

    name = enter_name.getText();
    vorname = enter_vorname.getText();
    strasse = enter_strasse.getText();
    plz = enter_plz.getText();
    stadt = enter_stadt.getText();
    abteilung = enter_abteilung.getText();
    String n = System.getProperty("line.separator");
    
    liste.setText("Speichern erfolgreich!\n" + "Speicherung in Datensatz: 1\n\n"
    );

    try{
    File data = new File ("data.txt");
    FileWriter write = new FileWriter(data, true);
    write.write(name + n + vorname + n + strasse + n + plz + n + stadt + n +
    abteilung + n);
    erase();
    write.flush();
    write.close();
    }
    catch(IOException ioexp){liste.setText("Fehler beim Speichern!");}

  }

  public void suche_name_ActionPerformed(ActionEvent evt) {
     String temp_name = suche_name.getText();

     if(name.contains(temp_name) || vorname.contains(temp_name)){
        ausgabe();
     } else {
       liste.setText("Suche Erfolglos! ");
     }
  }

  public void suche_adresse_ActionPerformed(ActionEvent evt) {
    String temp_adresse = suche_adresse.getText();
    
    if(strasse.contains(temp_adresse) || plz.contains(temp_adresse) ||
       stadt.contains(temp_adresse)){
         ausgabe();
       } else {
         liste.setText("Suche Erfolglos! ");
       }
  }

  public void suche_abteilung_ActionPerformed(ActionEvent evt) {
    String temp_abteilung = suche_abteilung.getText();
    
    if(abteilung.contains(temp_abteilung)){
      ausgabe();
    } else {
      liste.setText("Suche Erfolglos! ");
    }
  }

  public void button_suche_ActionPerformed(ActionEvent evt) {
    String temp_name = suche_name.getText();
    String temp_adresse = suche_adresse.getText();
    String temp_abteilung = suche_abteilung.getText();
    
    if(name.contains(temp_name)||vorname.contains(temp_name)||
    strasse.contains(temp_adresse)||plz.contains(temp_adresse)||
    stadt.contains(temp_adresse)||abteilung.contains(temp_abteilung)){
      ausgabe();
    } else {
      liste.setText("Suche Erfolglos! ");
    }
  }



  // Ende Methoden

  public static void main(String[] args) {
    new personal("personal");
  }
}

desweiteren habe ich mich weiter durch das Lehrbuch gewühlt und werde anstelle von einer txt-datei eine RandomAccessFile nehmen, aber da muss ich noch ein bisschen mehr basteln 😛
 

Zurück
Oben