[Java] Problem mit Exceptions...

Diskutiere und helfe bei [Java] Problem mit Exceptions... im Bereich Software & Treiber im SysProfile Forum bei einer Lösung; Hallo zusammen, ich hab grad versucht mir was in Java zusammen zu programmieren. Nur leider steckt irgendwo der Wurm drin.... So, was soll mein... Dieses Thema im Forum "Software & Treiber" wurde erstellt von mersa, 3. Juli 2010.

  1. mersa
    mersa Profi-Schrauber
    Registriert seit:
    26. März 2008
    Beiträge:
    305
    Zustimmungen:
    6
    1. SysProfile:
    47912
    2. SysProfile:
    106625

    Hallo zusammen,
    ich hab grad versucht mir was in Java zusammen zu programmieren. Nur leider steckt irgendwo der Wurm drin....

    So, was soll mein Programm überhaupt machen? Es soll eine lokale Datei einlesen und dann bissi was drauf machen - das is eher 'ne kleine Spielerei. Dazu brauche/nutze ich die Objekte File, FileReader und BufferedReader. Und da ich die in die verschiedenen Funktionen aufgesplittet habe, sind die Dinger auch global im Konstruktor definiert.

    An der markierten Stelle bekomm ich den Fehler "Unhandled exception type FileNotFoundException", meines Wissens nach, kann ich im Konstruktor aber keine Exceptions werfen - bzw. die Zeile mit try-catch umwickeln. Da scheint mir Eclipse auch zuzustimmen, da das dann noch mehr Fehler anzeigt....

    So, wie siehts aus? Weiß da jemand was? Onkel Google hab ich schon gefragt, aber der liefert mir keine sinnvolle Hilfe.

    Code:
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    	
    public class CodeCleaner{
    	static File codefile = new File("code.txt");
    -->	static FileReader reader = new FileReader(codefile); <-- hier böser Fehler
    	static BufferedReader buf = new BufferedReader(reader);
    	
    	public CodeCleaner() {
               [....]
    			
    	}
    
    static boolean load_file() throws FileNotFoundException{
    	
    	return codefile.exists();
    	}
    
    static void parse_file() throws IOException, FileNotFoundException{
    	int c = 0;
    	try
    	{
    		[....]
    			}
    	}
    	catch(FileNotFoundException fnf){
    		fnf.printStackTrace();
    	}
    }
    
    static void ausgabe() throws IOException{
    	[....]
    	}
    }
    
    
    public static void main(String[] args) throws FileNotFoundException, IOException, Exception{
    	
    	if (load_file() == true)
    		{
    		System.out.println("File loaded");
    		ausgabe();
    		parse_file();
    		ausgabe();
    		}
    	else { System.out.println("File not found.");
    	}
    	}
    
    }
    
    
     
    #1 mersa, 3. Juli 2010
    Zuletzt bearbeitet: 3. Juli 2010
  2. Klopfer
    Klopfer Praktikant
    Registriert seit:
    3. Januar 2007
    Beiträge:
    43
    Zustimmungen:
    1
    1. SysProfile:
    8961

    @mersa

    Eclipse ist schon ein tolles Programm und sofern die Fehler rot markiert werden, sollte man sie korrigieren, sonst wird eine Exception geworfen.
    Gelb markierte Fehler müssen nicht unbedingt korrigiert werden. Es kommt auf die Situation an, wie bestimmte Objekte genutzt werden.

    Du kannst eine Exception im Konstruktor werfen:

    Code:
    public CodeCleaner() throws IOException
    {
    ...
    }
    Allerdings muss die Exception auch einen Grund haben, dort zu sein. Bei einem leeren Konstruktor würde die Exception wenig Sinn machen.
    Sollte Eclipse jammern, dann könnte es daran liegen, dass der an einigen anderen Stellen z.B. Methoden ebenfalls eine Exception haben möchte.

    Du willst doch eine Datei auslesen, die doch bereits vorhanden ist, oder?

    Dann brauchste das hier nicht unbedingt (kannst es aber drin lassen):

    Code:
    static File codefile = new File("code.txt");
    Hier musste dann anstatt "codefile" den Dateinamen eingeben, sofern sich die Datei im Wurzelordner befindet ansonsten den Pfad dorthin, falls du codefile nicht verwenden möchtest:

    Code:
    static FileReader reader = new FileReader(codefile);
    Entferne außerdem vor File, FileReader und BufferedReader "static".
     
    #2 Klopfer, 13. Juli 2010
    Zuletzt bearbeitet: 13. Juli 2010
    1 Person gefällt das.
  3. mersa
    mersa Profi-Schrauber
    Themenstarter
    Registriert seit:
    26. März 2008
    Beiträge:
    305
    Zustimmungen:
    6
    1. SysProfile:
    47912
    2. SysProfile:
    106625
    Holla die Waldfee.... Den Thread hier hab ich schon vergessen... Ich hatte mich schon fast damit abgefunden, dass das nich ging. Ich wollte ich irgendwann wieder dran versuchen.

    Grad nochmal probiert. Stimmt, die Statics mussten weg. Man sollte dem Compiler also auch nicht blind vertrauen.

    Gibt'n Kilo Renomee und ein Eis.

    Edit: Ach verdammt. Geht doch nich... die public static void main besteht natürlich auf ihr static, und die anderen Funktionen wollen dann auch ein Static und dann simmer wieder vorne am Anfang.
    Schade. :( Muss ich mir mal die Tage nochmal angucken.

    Edit2: Achja, die Datei code.txt existiert natürlich und liegt im richtigen Ordner.
     
    #3 mersa, 13. Juli 2010
    Zuletzt bearbeitet: 13. Juli 2010
  4. x4u
    x4u Grünschnabel
    Registriert seit:
    12. Juli 2010
    Beiträge:
    5
    Zustimmungen:
    0
    1. SysProfile:
    135478
    Falls es dich interessiert ist hier noch eine etwas ausführlichere Erklärung:

    Das was du da implizit verwendet hast ist ein so genannter Static Initializer. Initializer sind z.B. die Statements mit denen einer Variable ein initialer Wert zugewiesen wird. Und da es sich hier um static Variablen handelt, landet das dann eben im Static Initializer.

    PHP:
          static File codefile = new File("code.txt");
          static 
    FileReader reader = new FileReader(codefile);
          static 
    BufferedReader buf = new BufferedReader(reader);
    Diese 3 Zuweisungen werden vom Compiler intern im Prinzip in folgenden Code umgewandelt und dann compiliert (die beiden Codeblöcke sind also vollkommen identisch und erzeugen auch den selben Bytecode):

    PHP:
          static File codefile;
          static 
    FileReader reader;
          static 
    BufferedReader buf;

          static {
                
    codefile = new File("code.txt");
                
    reader = new FileReader(codefile);
                
    buf = new BufferedReader(reader);
          }
    Diese eigenartige static Methode ohne Namen und Parameter ist eben jener static Initializer, der hier jetzt explizit verwendet wird. Das Konstrukt compiliert tatsächlich zu einer static Methode, die intern den Namen <clinit> hat und als allererstes nach bzw. beim Laden einer Klasse aufgerufen wird.

    In dieser Methode kannst du auch per try/catch Exceptions behandeln:

    PHP:
          static File codefile;
          static 
    FileReader reader;
          static 
    BufferedReader buf;

          static {
                
    codefile = new File("code.txt");
                try {
                      
    reader = new FileReader(codefile);
                      
    buf = new BufferedReader(reader);
                } catch( 
    IOException ioex ) {
                      
    ioex.printStackTrace();
                }
          }
    Allerdings wäre das in deinem Fall nicht der sinnvollste Weg, da die Variablen reader und buf dann ggf. null sind und du nicht unmittelbar an der Stelle auf die Exceptions reagieren könntest, an der der Reader verwendet wird, da diese Methode ja vom Classloader aufgerufen wird, also noch bevor deine main Methode aufgerufen wird. Im Prinzip könntest du die Exception auch weiterleiten, wenn du sie in einen Error oder eine RuntimeException kapselst, z.B. so:

    PHP:
                } catch( IOException ioex ) {
                      throw new 
    ExceptionInInitializerErrorioex );
                }
          }
    Dann würde die Klasse aber gar nicht erst vollständig geladen werden falls eine Exception auftritt. Sowas kann in bestimmten Fällen sinnvoll sein, aber für dein Programm wäre es besser es ungefähr so zu machen:

    PHP:
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
        
    public class 
    CodeCleaner
    {
        protected 
    String filename;
        protected 
    BufferedReader buf;
        
        public 
    CodeCleanerString name  )
        {
            
    filename name;
            
    // [....]
        
    }

        public 
    boolean loadFile()
        {
            try {
                
    buf = new BufferedReader( new FileReaderfilename ) );
            } catch( 
    IOException ioex ) {
                
    ioex.printStackTrace();
                return 
    false;
            }
            return 
    true;
        }
            
        public 
    void closeFile()
        {
            if( 
    buf == null // File ist nicht geöffnet
                
    return;
            try {
                
    buf.close();
            } catch( 
    IOException ioex ) {
                
    // ioex.printStackTrace();
                // Die Ausgabe kann man bei close() weglassen. Der Fall tritt sowieso nie auf.
            
    }
            
    buf null;
        }

        public 
    void parseFile() throws IOException
        
    {
            
    // [...]
        
    }

        public 
    void ausgabe() throws IOException
        
    {
            
    // [...]
        
    }

        public static 
    void mainString[] args throws Throwable
        
    {
            
    String name "code.txt";
            if( 
    args.length >= // Name kann auch per Kommandozeile übergeben werden
                
    name args];

            
    CodeCleaner cc = new CodeCleanername );
            if( 
    cc.loadFile() )
            {
                
    System.out.println"File loaded" );
                
    cc.ausgabe();
                
    cc.parseFile();
                
    cc.closeFile();
                
    cc.ausgabe();
            }
            else
            {
                
    System.out.println"File not loaded." );
            }
        }
    }
     
    #4 x4u, 13. Juli 2010
    Zuletzt bearbeitet: 13. Juli 2010
  5. Klopfer
    Klopfer Praktikant
    Registriert seit:
    3. Januar 2007
    Beiträge:
    43
    Zustimmungen:
    1
    1. SysProfile:
    8961
    @mersa

    Du kannst doch die main()-Methode von der Klasse CodeCleaner löschen und diese in eine andere Klasse z.B. namens Application.java, die nur die main()-Methode enthält, einfügen.

    In der Klasse kannste dann einen neuen CodeCleaner erzeugen und dort jeweils auf die Methoden von CodeCleaner zugreifen und in der Klasse CodeCleaner.java müssen dann File, FileReader, BufferedReader nicht mehr static sein.
     
  6. Klopfer
    Klopfer Praktikant
    Registriert seit:
    3. Januar 2007
    Beiträge:
    43
    Zustimmungen:
    1
    1. SysProfile:
    8961
    @mersa

    Habe mir deinen Code genauer angeschaut. Du hast sogar die Methoden "static" gemacht. Das musste aber nicht. Lass das "static" weg und dein Code sollte dann auch funktionieren.

    Außerdem habe ich dein Code bissel umgeschrieben und eine zweite Klasse erzeugt, um dann dort die main()-Methode zu benutzen.

    Die parse_file()-Methode habe ich nicht bearbeitet, schließlich weiß ich nicht, was du mit ihr machen möchtest.

    Code:
    package testpackage;
    
    import java.io.*;
        
    public class CodeCleaner
    {
        File codefile; //= new File("code.txt");
        FileReader reader; //= new FileReader(codefile); 
        BufferedReader buf; //= new BufferedReader(reader);
        
        public CodeCleaner(String s) throws FileNotFoundException
        {
            this.codefile = new File(s);
            this.reader = new FileReader(codefile);
            this.buf = new BufferedReader(reader);
        }
    
        public boolean load_file() throws FileNotFoundException
        {
            return codefile.exists();
        }
    
        public void parse_file() throws IOException, FileNotFoundException
        {
            //int c = 0;
        }
    
        public void ausgabe() throws IOException
        {
            String zeile;
    
            while((zeile = buf.readLine()) != null)
            {
                System.out.println(zeile);
            }
        }
    }
    Code:
    package testpackage;
    
    import java.io.*;
    
    public class Application
    {
        public static void main(String... args) throws FileNotFoundException, IOException, Exception
        {
            CodeCleaner c = new CodeCleaner("readme.txt");
            if (c.load_file() == true)
            {
                    System.out.println("File loaded:");
                    c.ausgabe();
                    //c.parse_file();
                    //c.ausgabe();
            }
            else
            {
                System.out.println("File not found.");
            }
        }
    }
    Einfach in Eclipse diese Klassen und das Package (ich arbeite lieber mit Packages, ist aber bei mehreren JAVA-Dateien ebenfalls sinnvoll, um die Übersicht nicht zu verlieren ;)) erzeugen und den obigen Code einfügen.
    Bei Eclipse muss außerdem die Datei, die du lesen möchtest im gleichen Ordner liegen wie der src-Ordner.

    Wenn du die Konsole zum Kompilieren und Ausgeben nutzt, dann muss sich die Datei außerhalb des Package liegen. Im obigen Code also im gleichen Ordner wo sich der testpackage-Ordner befindet.

    Fragen? Fragen! :great:
     
  7. mersa
    mersa Profi-Schrauber
    Themenstarter
    Registriert seit:
    26. März 2008
    Beiträge:
    305
    Zustimmungen:
    6
    1. SysProfile:
    47912
    2. SysProfile:
    106625
    Also, hab mal kurz nen Blick drübergeworfen... Sieht auf jeden Fall schonmal interessant aus. Nur leider bin ich diese Woche noch so richtig im Klausurstress. Danach schau ich es mir aber genauer an. Versprochen. :)
     
  8. mersa
    mersa Profi-Schrauber
    Themenstarter
    Registriert seit:
    26. März 2008
    Beiträge:
    305
    Zustimmungen:
    6
    1. SysProfile:
    47912
    2. SysProfile:
    106625

    Das Gerüst vom Klopfer funktioniert und macht was es soll. Danke und R+.

    Jetzt kann ich mich endlich dem Parser widmen.

    Edit: "Sie müssen erst einige Beiträge anderer Benutzer bewertet haben, bevor Sie Klopfer erneut bewerten können." bekomm ich grad. Könnte jemand von der Crew bitte dem lieben Klopfer ein Kilo Renomee in meinem Namen geben.
     
    #8 mersa, 20. Juli 2010
    Zuletzt bearbeitet: 20. Juli 2010
  9. Error:Failed connect to localhost:9200; Connection refused
Thema:

[Java] Problem mit Exceptions...

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden