# eigene Ausnahmeklassen schreiben



## Laren (29. Jan 2011)

Hi,

Mir wurde hier schon sehr stark mit meinen Aufgaben geholfen...danke nochmal.
Jetzt hab ich folgende Aufgabe bekommen :
"Erstellen Sie ein Java-Programm zum Suchen und Ersetzen von Texten in
Dateien. Der Aufruf soll wie folgt erfolgen:

	java Replace suchstring ersetzungsstring datei1 datei2 ...."

und habe schon durch Hilfe von diesem Forum und "Java ist auch eine Insel" diesen Ansatz geschafft(man sollte beachten, dass das Programm noch zu Testzwecken über einen Dialog gesteuert wird und nicht wie in der Aufgabe verlangt über den Aufruf):


```
package Ueb10;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

import de.htw.saarland.stl.Stdin;


public class Replace {

	/**
	 * @param args
	 * args[0] übergibt den suchstring
	 * args[1] übergibt den ersetzungsstring
	 * args[2] übergibt die Datei 1
	 * args[3] übergibt die Datei 2
	 * .....
	 * 
	 */
	//**********Attribute************
	public static String ausgabe;
	public static String suchen="";
	public static String ersetzen="";
	public static void main(String[] args) {
		getDatei();
		suchen =Stdin.readlnString("suche");

		ersetzen = Stdin.readlnString("ersetzen");
		setDatei();
		getDatei();
	}
	
	public static void getDatei()
	{
		Reader reader = null;
		ausgabe = "";
		try
		{
			reader = new FileReader ("Test.txt");
			for(int c; (c=reader.read()) !=-1;)
			{
				ausgabe = ausgabe +(char) c;
			}
			    System.out.println(ausgabe);
		}
		
		
		catch(IOException e)
		{
			System.out.println("Fehler beim lesen");
		}
		finally 
		{
			try 
			{
				reader.close();
			}
			catch (Exception e) 
			{
		
			}
		}

	}
	

	
	public static void setDatei()
	{
		Writer fw = null;
		try
		{
			fw = new FileWriter("Test.txt");
			fw.write(ausgabe.replace(suchen, ersetzen));
			}
		catch(IOException e)
		{
		System.err.println("Datei nicht geschrieben");
	}
	finally
	{
		if (fw != null)
		{
			try
			{
				fw.close();
			}
			catch (IOException e )
			{
				e.printStackTrace();
			}
			}
		}
	}
	

}
```

Jetzt steht als Zusatz, dass man *eingene* Ausnahmeklassen schreiben soll und wurde durch einen Beitrag dieses Forums hier hin verlinkt. 
Jetzt ist meine Frage:
Was bringt mir das, gebe ich dann nicht nur einer RuntimeException den neuen Namen PlayerException, oder verstehe ich da was falsch?

Viele Grüße


----------



## Noctarius (29. Jan 2011)

Im Prinzip leitest du nur die Klasse Exception oder RuntimeException ab, das ist richtig. Der Vorteil liegt darin, dass man dann nur bestimmte Exception-Typen fangen kann.
Wenn man immer nur RuntimeException werfen würde müsstest du in jedem catch-Block erstmal den Text der Fehlermeldung (oder einen Fehlercode) analysieren und entscheiden ob du diesen brauchst. So sagst du einfach nur "fang mir alle PlayerExceptions aber alles andere lass durch".


----------



## Laren (29. Jan 2011)

ok, 
aber wie setzte ich das z.b. bei mir um, sollte man "catch(IOException e)" durch "catch(MeineDatenTransferException e)" umschreiben, oder was soll ich tun^^
Sorry, ein paar Verständnisprobleme

Grüße


----------



## Laren (29. Jan 2011)

Hi,

Mit der Methode getDatei, hab ich angefangen, aber es funktioniert einfach nicht, was mache ich falsch?


```
package Ueb10;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

import de.htw.saarland.stl.Stdin;




	@SuppressWarnings("serial")
	class ReneDateiTransferException extends IOException {
	public ReneDateiTransferException()         { super(); }
    public ReneDateiTransferException(String s) { super(s); }
}
	class ReneDateiRechteException extends IOException {
		public ReneDateiRechteException()         { super(); }
	    public ReneDateiRechteException(String s) { super(s); }
	}
public class Replace {

	/**
	 * @param args
	 * args[0] übergibt den suchstring
	 * args[1] übergibt den ersetzungsstring
	 * args[2] übergibt die Datei 1
	 * args[3] übergibt die Datei 2
	 * .....
	 * 
	 */
	//**********Attribute************
	public static String ausgabe;
	public static String suchen="";
	public static String ersetzen="";
	private static File inputFile;
	public static void main(String[] args) throws ReneDateiTransferException, ReneDateiRechteException
	{
	  run();
	}
	public static void run() throws ReneDateiTransferException, ReneDateiRechteException
	{
		getDatei();
		suchen =Stdin.readlnString("suche");
		ersetzen = Stdin.readlnString("ersetzen");
		setDatei();
		getDatei();	
	}
	
	public static void getDatei() throws ReneDateiTransferException, ReneDateiRechteException 
	{
		Reader in = null;
		ausgabe = "";
		try
		{
			File inputFile = new File("test.txt");
		
			
			in = new FileReader (inputFile);
			
			for(int c; (c=in.read()) !=-1;)
			{
				ausgabe = ausgabe +(char) c;
			}
			    System.out.println(ausgabe);
		}
		
		
		catch(IOException e)
		{
			if (inputFile.exists()==false)
			{
				throw new ReneDateiTransferException("Kann Datei nicht finden: "+ inputFile );
			}
			if (inputFile.isDirectory()==true)
			{
				throw new ReneDateiTransferException("Datei ist ein Verzeichnis "+ inputFile );
			}
			if (inputFile.isFile()==false)
			{
				throw new ReneDateiTransferException("Datei ist keine normale Datei "+ inputFile );
			}
			if (inputFile.canRead()==true)
			{
				throw new ReneDateiRechteException("Datei kann nicht gelesen werden "+ inputFile );
			}
		}
		finally 	
		{
			try 
			{
				in.close();
			}
			catch (Exception e) 
			{
		
			}
		}

	}
	

	
	public static void setDatei()
	{
		Writer fw = null;
		try
		{
			fw = new FileWriter("Test.txt");
			fw.write(ausgabe.replace(suchen, ersetzen));
			}
		catch(IOException e)
		{
		System.err.println("Datei nicht geschrieben");
	}
	finally
	{
		if (fw != null)
		{
			try
			{
				fw.close();
			}
			catch (IOException e )
			{
				e.printStackTrace();
			}
			}
		}
	}
	

}
```


----------



## Laren (29. Jan 2011)

ok, habs jetzt geschaft^^
nächste Frage, wie schaffe ich, dass er nichts mehr in die Datei schreibt, weil wenn er eine Exception fängt, dann löscht er den Inhalt der Klasse(legt sie neu an und schreibt nichts hinein) aber wie kann ich das verhinden?


```
package Ueb10;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import Ueb10.*;
import de.htw.saarland.stl.Stdin;
 
 
 
 

public class Replace {
 
    /**
     * @param args
     * args[0] übergibt den suchstring
     * args[1] übergibt den ersetzungsstring
     * args[2] übergibt die Datei 1
     * args[3] übergibt die Datei 2
     * .....
     * 
     */
    //**********Attribute************
    public static String ausgabe;
    public static String suchen="";
    public static String ersetzen="";
    private static File inputFile;
    public static void main(String[] args) 
    {
      run();
    }
    public static void run() 
    {
        getDatei();
        suchen =Stdin.readlnString("suche");
        ersetzen = Stdin.readlnString("ersetzen");
        setDatei();
        getDatei(); 
    }
    
    public static void getDatei() 
    {
        Reader in = null;
        ausgabe = "";
        try
        {
            File inputFile = new File("bin");
            if (inputFile.exists()==false)
            {
            	throw new ReneDateiNichtGefundenException("Datei existiert nicht!");
            }
            if (inputFile.isDirectory()==true)
            {
            	throw new ReneDateiNichtGefundenException("Datei ist ein Verzeichnis!");
            }
            if (inputFile.canRead()==false)
            {
            	throw new ReneDateiNichtGefundenException("Datei kann nicht gelesen werden!");
            }
            in = new FileReader (inputFile);
            
            for(int c; (c=in.read()) !=-1;)
            {
                ausgabe = ausgabe +(char) c;
            }
                System.out.println(ausgabe);
        }
        catch(ReneDateiNichtGefundenException e)
        {
            System.err.println( "Falsche Datei eingabe abgefangen" );
            e.printStackTrace();
            

        }
        catch(ReneDateiLeserechteException e)
        {
            System.err.println( "Fehler bei den Leserechten abgefangen" );
            e.printStackTrace();
           
        }
        
        catch(IOException e)
        {
        
        }
        finally     
        {
            try 
            {
                in.close();
            }
            catch (Exception e) 
            {
        
            }
        }
 
    }
    
 
    
    public static void setDatei()
    {
        Writer fw = null;
        try
        {
            fw = new FileWriter("Test.txt");
            fw.write(ausgabe.replace(suchen, ersetzen));
            }
        catch(IOException e)
        {
        System.err.println("Datei nicht geschrieben");
    }
    finally
    {
        if (fw != null)
        {
            try
            {
                fw.close();
            }
            catch (IOException e )
            {
                e.printStackTrace();
            }
            }
        }
    }
    
 
}
```


----------



## Marco13 (29. Jan 2011)

Viele Alternativen zu
- in eine Temporäre Datei schreiben (siehe File#createTempFile oder so)
- NUR wenn alles glatt geht:
--- alte Datei löschen
--- temp-Datei umbenennen
gibt's da glaub' ich nicht.


----------

