2017-08-01 3 views
1

Considérez le code suivantmanipulation IOException dans plusieurs méthodes

public class foo { 
    public static void main(String[] args) { 
    MyClass mc = new MyClass(); 
    mc.read(); 
    } 
} 

et

public class MyClass { 
    private BufferedWriter verb; 
    private String vFile; 
    MyClass() 
    { 
    try { 
     verb = new BufferedWriter(new FileWriter(vFile)); 
    } catch(IOException e) { 
     System.out.println("Internal error1"); 
     System.out.println(e.getMessage()); 
    } 
    } 
    public void read() 
    { 
    // read a file and create an array 
    verb.write("Array created"); // ERROR 
    } 
} 

Comme vous pouvez le voir le write n'est pas placé dans un bloc try..catch. Je peux écrire un crochet pour cela, mais MyClass a beaucoup de méthodes et verb.write est fortement utilisé. Je peux également écrire public void read() throws IOException pour lancer l'exception à l'appelant, main(). Encore je dois mettre mc.read() dans un bloc try..catch. Depuis MyClass a de nombreuses méthodes, alors je dois les mettre tous dans un bloc catch dans le main().

Alors, y a-t-il une meilleure façon de gérer cela? Est-il possible de rediriger toutes les exceptions liées à verb vers le constructeur, MyClass() où un try..catch est défini?

+2

OT: Pourquoi diable avez-vous une méthode nommée *** read *** qui fait le contraire: *** écrit ***? ? –

+0

"Redirection vers le constructeur"? Que voulez-vous dire? Le constructeur s'exécute toujours en premier, et votre méthode 'read' qui écrit est exécutée plus tard. Comment imaginez-vous que vous pourriez "rediriger" quelque chose qui se passe plus tard à quelque chose qui est arrivé plus tôt? Voyage dans le temps? –

+0

Veuillez voir la publication mise à jour. Le 'read()' lit un fichier d'entrée, puis j'écris un message dans un fichier verbeux. – mahmood

Répondre

1

Une approche est de faire votre propre emballage « sécurité » autour BufferedWriter (pour cette matière, toute sorte de Writer) et la poignée I/O errors là:

class SafeWriter { 
    private final Writer writer; 
    public SafeWriter(Writer writer) { 
     this.writer = writer; 
    } 
    public void write(int n) { 
     try { 
      writer.write(n); 
     } catch (IOException e) { 
      handleException(e); 
     } 
    } 
    public void write(String s) { 
     try { 
      writer.write(s); 
     } catch (IOException e) { 
      handleException(e); 
     } 
    } 
    ... // Provide wrappers for other methods here 
    private void handleException(IOException e) { 
     ... 
    } 
} 

Maintenant, vous pouvez utiliser write méthodes sur votre nouvelle classe pour gérer les exceptions de manière uniforme à l'intérieur de la classe:

private SafeWriter verb; 
... 
verb = new SafeWriter(new BufferedWriter(new FileWriter(vFile)));