[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
Thema:

[Java] Problem mit Exceptions...

Die Seite wird geladen...

[Java] Problem mit Exceptions... - Similar Threads - Java Problem Exceptions

Forum Datum

wie viel fps hätte ich in java mit:?

wie viel fps hätte ich in java mit:?: intel core i5-6600 Gtx 1030 Low Sff 500gb ssd Performance sata ||| 16gb Ram ? https://www.gutefrage.net/frage/wie-viel-fps-haette-ich-in-java-mit
Prozessoren 15. April 2024

wie viel fps in minecraft java?

wie viel fps in minecraft java?: mit dem intel core i9-9900k und hd graphics 530? https://www.gutefrage.net/frage/wie-viel-fps-in-minecraft-java
Prozessoren 15. April 2024

Minecraft Java hohe CPU Auslastung?

Minecraft Java hohe CPU Auslastung?: Hallo, ich habe seit heute das Problem, dass wenn ich Minecraft spiele, die CPU immer zu 100% ausgelastet ist. Ich weiß nicht genau ob es schon ab heute so ist oder schon als ich es gekauft...
Prozessoren 21. Februar 2024

Minecraft Java startet nicht?

Minecraft Java startet nicht?: Hallo mein Freund hat das Problem das sein Minecraft Java nicht richtig startet. Es lädt bis der Balken ganz Voll ist aber es Startet dann nicht. Er hat es auf einer SSD gespeichert und wir...
Festplatten, SSDs & Wechselmedien 21. Januar 2024

Hey hat jemand den ryzen 5 7600x mit 4060 4060ti und spielet Minecraft Java wenn ja was...

Hey hat jemand den ryzen 5 7600x mit 4060 4060ti und spielet Minecraft Java wenn ja was...: 7600x 4060 4060ti...
Prozessoren 1. Januar 2024

hallo leute kennt sich jemand mit minecraft java redstone aus?

hallo leute kennt sich jemand mit minecraft java redstone aus?: ich habe einen hebel mit einem droppper mit redstone verbunden. ich möchte dass wenn ich den hebel aktiviere kein wasser aus dem dropper kommt sondern nur wenn ich ihn also das redstone signal...
Prozessoren 6. November 2023

Wie zum henker bekomme ich RTX in Minecraft Java?

Wie zum henker bekomme ich RTX in Minecraft Java?: Hab mir MC bei Microsoft direkt gekauft mit der erwartung, dass ich sofort mit raytracing spielen kann. Musste feststellen, dass man irgendwelche Dinger runterladen muss und 1 milion Schritte...
Grafikkarten 2. Juli 2023

Minecraft Java wird nur über integrierte Grafikkarte ausgegeben?

Minecraft Java wird nur über integrierte Grafikkarte ausgegeben?: Hallo. Ich habe versucht über den Minecraft launcher, Minecraft Java mit einer Grafik mod zu starten. Nun ist mir aufgefallen dass das Spiel über die integrierte Grafikkarte läuft, anstatt über...
Grafikkarten 27. Januar 2023

Phase - 6 funktioniert nicht? (Java - Problem)

Phase - 6 funktioniert nicht? (Java - Problem): Phase - 6 funktioniert nicht? (Java - Problem)
Computerfragen 19. April 2014

Problem beim Java-Update

Problem beim Java-Update: Hi zusammen, ich hab hier das Notebook meiner Frau (Win 7/32), auf dem ich von JRE 6U26 auf U31 updaten wollte. Allerdings bekomme ich die Meldung "Zugriff auf Netzwerkadresse : nicht...
freie Fragen 25. April 2012

MINECRAFT - Problem beim Starten (Java Virtual Machine Launcher)

MINECRAFT - Problem beim Starten (Java Virtual Machine Launcher): MINECRAFT - Problem beim Starten (Java Virtual Machine Launcher) Hey Leute! Mein Minecraft spinnt irgendwie... Also: Ich spiele Minecraft, dann hakt es kurz und im nächsten Moment...
Computerfragen 2. Oktober 2011

java problem zur installation deswegen kann minecraft kann nicht gezockt werden

java problem zur installation deswegen kann minecraft kann nicht gezockt werden: java problem zur installation deswegen kann minecraft kann nicht gezockt werden moin moin ick wollte heute minecraft zocken und musste feststellen das mein rechner rumzickt XD es erscheint...
Computerfragen 30. April 2011

Problem mit Java/Minecraft

Problem mit Java/Minecraft: Problem mit Java/Minecraft Hallo, Wenn ich MInecraft starte kommt zwar der Lade Bildschirm nach dem Login aber dann stürzt das Spiel ab (Fenster schließt sich). Es wurde dann...
Computerfragen 25. Januar 2011
[Java] Problem mit Exceptions... solved
  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden