2017-08-01 43 views
1

處理請看下面的代碼IOException異常在多個方法

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

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 
    } 
} 

正如你可以看到write不放在一個try..catch塊。我可以寫一個捕獲,但MyClass有很多方法和verb.write被嚴重使用。我也可以寫public void read() throws IOException來拋出異常給調用者,main()。不過,我必須將mc.read()放在try..catch區塊中。由於MyClass有很多方法,因此我必須將它們全部放在main()的catch塊中。

那麼,有沒有更好的方法來處理?是否有可能將與verb相關的所有異常重定向到定義了try..catch的構造函數MyClass()

+2

OT:爲什麼地球上您已經閱讀名爲***的方法***,實際上則正好相反:*** ***寫? ? –

+0

「重定向到構造函數」?你什麼意思?構造函數總是首先執行,而您的'read'方法將在稍後執行。你怎麼想像你可以將之後發生的事情「重定向」到之前發生的事情?時間旅行? –

+0

請參閱更新後的帖子。 'read()'讀取輸入文件,然後在詳細文件中寫入消息。 – mahmood

回答

1

一種方法是讓自己的「安全」的包裝器BufferedWriter(就此而言,任何類型的Writer)和處理I /有O錯誤:

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) { 
     ... 
    } 
} 

現在你可以使用write方法你新類來處理異常的類中以統一的方式:

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