2012-02-20 4 views
0

私はオブジェクトをファイルに書き込む方法を書いています。 ジェネリックを使って、Objectから派生したオブジェクトも書き込むことができます(Object型のパラメータを受け入れることもできますが、これはもっとはっきりしています)。 ファイルを書く実用的な例外があります

public static <T extends Object> void write(T item,String path) 
throws FileNotFoundException,IOException 
{ 
    ObjectOutputStream os; 
    Object obj=item; 
    os=new ObjectOutputStream(new FileOutputStream(path)); 
    os.writeObject(obj); 
    os.close(); 
} 

だから疑いが実利についてです:

public static <T extends Object> void nothrow_write(T item,String path) 
{ 
    ObjectOutputStream os; 
    Object obj=item; 
    try 
    { 
     os=new ObjectOutputStream(new FileOutputStream(path)); 
     os.writeObject(obj); 
     os.close(); 
    } 
    catch(FileNotFoundException e) 
    { 
     System.out.println(e); 
    } 
    catch(IOException e) 
    { 
     System.out.println(e);  
    } 
} 

方法は、より実践的である:?私も方法の第二のバージョンを書かれているので、それらを処理せず、例外が行く残して正しいです正しい? 最初の問題は、例外がスローされた場合、ストリームが開いたままであることです。あなたが最終的に流れを確実にするためにブロックを使用でき

+2

このようなジェネリックを使用しても、私にはnse。それは 'void write(Object、String)'よりもどうやって明らかですか? –

+0

_はい、そうです。私は、ジェネリックをより明確にするためだけに使用することを指定しました。オブジェクトも受け入れることができます。_ –

+0

ストリームは2番目の例外でも例外なくオープンのままです。 – fgb

答えて

1
public static void write(Object item, String path) 
    throws FileNotFoundException, IOException 
{ 
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path)); 
    try { 
    os.writeObject(obj); 
    } finally { 
    os.close(); 
    } 
} 
2

をご希望の場合は、まだ例外をスローしながら閉じている:

public static <T extends Object> void myMethod(T item,String path) throws FileNotFoundException,IOException 
{ 
    ObjectOutputStream os; 
    Object obj=item; 
    try 
    { 
     os=new ObjectOutputStream(new FileOutputStream(path)); 
     os.writeObject(obj); 
    } 
    catch(FileNotFoundException e) 
    { 
     throw e; // Perhaps log the error before throwing 
    } 
    catch(IOException e) 
    { 
     throw e; // Perhaps log the error before throwing 
    } 
    finally 
    { 
     // Close stream here 
    } 

} 
+0

os.close()をtryからfinallyへ移動してはいけませんか? – mck

+0

更新...私は彼の例をコピーして貼り付けただけです。 –

1

最初のバージョンが間違っています。あなたが述べたように、それが起こるのを待ってリソースリークです:

public static void write() throws Exception 
{ 
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path)); 
    os.writeObject(obj); 
    os.close(); 
} 

番目のバージョンが改善された - 少なくとも、あなたが(近くをやっています)。

その他のオプションが含まれます:

1)ファイルを閉じて、発信者

2に戻って、例外を再スロー) "ついに" 句を使用します

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

」を希望が助けます...

+0

'finally-block'は' try-with-resources'ブロックよりも優れた練習ですか? –

+0

try-with-resourcesはJava 7のみです。それはあなたにとって大丈夫かもしれません。しかし、世界のほとんどはまだJava 6(およびそれ以前)です。そして、OracleがJavaを引き継いだ今、Java 7の採用がどのくらい速く行われるかははっきりしていません... IMHO ... – paulsm4

関連する問題