Announcement

Collapse
No announcement yet.

Probleme mit IOExceptions

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit IOExceptions

    Hi Leutz,

    ich hab gerade ein mehr oder weniger grosses Problem mit meinem Code.<br>
    Ich habe eine Methode geschrieben, die mit Hilfe der FileWriter-Klasse<br>
    ein Datei anlegt und auf diese zugreift. Diese Methode soll nun <br>
    aufgerufen werden, wenn man auf einen Button klickt. Das habe ich mit<br>
    der ActionListener-Klasse gemacht. Nun meldet mir der Compiler aber<br>
    einen IOException-Error in der aufrufenden ActionListener-Methode.<br>
    Wenn ich den entsprechenden Code mit der Try-Catch-Klausel abfange,<br>
    wird er jedoch scheinbar nicht ausgeführt. Wenn ich den Code in<br>
    den Finally-Block schreibe, kommt wieder der Exception-Error. Bitte<br>
    helft mir. Im folgenden habe ich den Quellcode beider Methoden und <br>
    die original Fehlermeldung noch einmal zu besseren <br>
    Veranschaulichung meines Problems abgedruckt:

    1. Methode mit FileWriter:
    <PRE>
    public static void main(String[] args)
    {
    }

    //Name_Rueck
    static String name_rueck(String n)
    throws IOException
    {
    FileReader fr1 = new FileReader("Database.dll");
    BufferedReader br1 = new BufferedReader(fr1);

    String zeile1;
    String name1;
    String festnetz1;
    String handy1;
    String cache1;
    boolean cache12;
    String rw = "";

    zeile1 = br1.readLine();
    StringTokenizer st1 = new StringTokenizer(zeile1);
    cache1 = st1.nextToken();

    while(true)
    {

    cache12 = st1.hasMoreTokens();

    if (cache12 == false)
    {

    rw = "Es wurde kein Eintrag mit dem Namen " +n+ " gefunden.";
    return rw;

    }
    else if (cache1.equals(n))
    {
    name1 = cache1;
    cache1 = st1.nextToken();
    festnetz1 = cache1;
    cache1 = st1.nextToken();
    handy1 = cache1;

    rw = name1;
    return rw;

    }
    else
    {
    cache1 = st1.nextToken();
    }

    }
    }

    2. aufrufende Methode:

    class DBSearch implements ActionListener
    {
    public void actionPerformed(ActionEvent e)
    throws IOException
    {
    DB_Search dbs = new DB_Search();
    String temp = tf_name.getText();
    String temp2;
    temp2 = dbs.name_rueck(temp);
    view.setText(temp2);
    }
    }

    Fehlermeldung:
    "TelefonmanagerGUI.java": Fehler #: 463 : method actionPerformed(java.awt.event.ActionEvent) in Klasse TelefonmanagerGUI.DBSearch kann nicht %1 in Schnittstelle java.awt.event.ActionListener implementieren, die implementierte Methode löst nicht java.io.IOException aus in Zeile 69, Spalte 5

    "TelefonmanagerGUI.java": Fehler #: 463 : method actionPerformed(java.awt.event.ActionEvent) in Klasse TelefonmanagerGUI.DBSearch kann nicht %1 in Schnittstelle java.awt.event.ActionListener implementieren, die implementierte Methode löst nicht java.io.IOException aus in Zeile 71, Spalte 20
    </PRE>

  • #2
    Lass doch mal in Deiner Klasse DBSearch das "throws IOException" weg

    Comment


    • #3
      Wenn ich die Exception weg lasse, meldet er etwas von "unbekannte IOException" und das sie abgefangen oder zum Auslösen deklariert werden soll

      Comment


      • #4
        Stimmt. Deine Methode dbs.name_rueck wirft diese IOException. (Hatte es mir nicht genau angeschaut...) Probiere mal folgendes aus:<br>
        public void actionPerformed(...) <br>
        {<br>
        .... <br>
        try<br>
        {<br>
        temp2 = dbs.name_rueck(temp);
        }<br>
        catch(IOException ex)<br>
        {<br>
        // do something
        }<br>
        }<br>
        }<br>
        <br>
        Gruß<br>
        Jochen Glin

        Comment


        • #5
          Hallo Kevin,

          das Interface ActionListener besitzt halt keine Methode
          die eine IOException wirft. Deshalb ist für den Compiler
          dieses Interface nicht implementiert.

          Thoma

          Comment


          • #6
            An Jochen: Das habe ich schon ausprobiert. Dann meldet er aber, dass die Variable temp2 nicht gefunden wurde und verweist auf den Code nach der catch-Anweisung. Also leider auch nix :-(((

            An Thomas: Ja, das habe ich mir schon gedacht. Aber was kann man dagegen machen bzw. was gibt es in meinem Programm für Alternativen?

            Comment


            • #7
              Guten Morgen,

              fange die Exception in der Methode name_rueck() ab. Falls eine IOException auftaucht, dann kannst du ja einen entsprechenden Hinweisstring zurückgeben.

              Ausserdem solltest du deine Reader mit close() wieder schliessen.
              Thoma

              Comment


              • #8
                Geht leider auch nicht. Wenn ich die Exception in der Methode name_rueck abfange, meldet er wieder "unbekannte Exception in der Methode DBSearch" und bezieht sich auf die aufrufende Zeile:
                temp2 = dbs.name_rueck(temp);

                Hm, so langsam bin ich mit meinem Latein echt am Ende :-((

                Comment


                • #9
                  hast du denn die Klausel throws IOException aus den Methoden entfernt

                  Comment


                  • #10
                    Ja, habe ich. Sowohl aus name_rueck sowie auch aus DBSearch.
                    Der Code sieht jetzt folgendermassen aus:
                    <PRE>
                    //Name_Rueck
                    static String name_rueck(String n)
                    {

                    String zeile1;
                    String name1;
                    String festnetz1;
                    String handy1;
                    String cache1;
                    boolean cache12;
                    String rw = "";

                    try{
                    FileReader fr1 = new FileReader("Database.dll");
                    BufferedReader br1 = new BufferedReader(fr1);
                    }
                    catch ( IOException fx ) {}

                    zeile1 = br1.readLine();
                    StringTokenizer st1 = new StringTokenizer(zeile1);
                    cache1 = st1.nextToken();

                    while(true)
                    {
                    ...

                    class DBSearch implements ActionListener
                    {
                    public void actionPerformed(ActionEvent e)
                    {
                    String temp;
                    String temp2 = "";
                    DB_Search dbs = new DB_Search();
                    temp = tf_name.getText();
                    temp2 = dbs.name_rueck(temp);
                    view.setText(temp2);
                    }
                    }
                    </PRE>
                    Das Kuriose ist auch, dass er jetzt nicht mehr die Variablen br1 und fr1 findet. Es ist also, als würde der Code in der Try-Klausel<BR>
                    a) nicht ausgeführt werden<BR>
                    oder<BR>
                    b) vom Rest des Codes abgeschirmt werde

                    Comment


                    • #11
                      Hi,

                      das ist nicht kurios, sondern normal. Die beiden Variablen sind nur sichtbar innerhalb der beiden geschweiften Klammern.
                      Das Konstrukt ist ohnehin nicht logisch, da du nach dem catch Block aus der Datei lesen willst die möglicherweise nicht geöffnet werden konnte. Deshalb musst du ja den try catch machen um in diesem Fall
                      angemessen reagieren zu können.
                      Ausserdem solltest du FileNotFoundException benutzen.

                      So sollte es jetzt zu kompilieren sein:

                      <pre>

                      static String name_rueck(String n)
                      {
                      String zeile1;
                      String name1;
                      String festnetz1;
                      String handy1;
                      String cache1;
                      boolean cache12;
                      String rw = "";
                      try
                      {
                      FileReader fr1 = new FileReader("Database.dll");
                      BufferedReader br1 = new BufferedReader(fr1);
                      zeile1 = br1.readLine();
                      StringTokenizer st1 = new StringTokenizer(zeile1);
                      cache1 = st1.nextToken();
                      }
                      catch ( FileNotFoundException fx )
                      {
                      System.out.println("Datei nicht gefunden ");
                      }
                      catch (IOException ioex)
                      {
                      System.out.println("I/O Fehler");
                      }

                      }
                      </pre&gt

                      Comment


                      • #12
                        JAAAA, ES FUNZT!!!!!!!
                        Zuerst hat es nicht funktioniert, da auch im nachfolgenden Code <br>
                        auf die Variablen br1 und fr1 zugegeriffen wurde. Diesen Code hab <br>
                        ich dann auch komplett in den Try-Block gesetzt und zudem noch <br>
                        die Datei "Database.dll" angelegt (ich dachte, er würde sie <br> automatisch anlegen). Und siehe da: Es geht!!! <br>

                        An dieser Stelle nochmal besten Dank an Dich Thomas

                        Comment

                        Working...
                        X