2016-04-29 7 views
1

私は長い間のギャップの後にJavaでコードを書くことに戻ります - ここ数年のコーディング作業の多くは、PHPで行われています& JavaScript - 満足するためにもっと努力する必要があることを発見しています可変スコープや例外処理などの問題に関してはるかに厳しいJavaコンパイラです。私に何らかの問題を引き起こしたコードが以下に示されていますJava Scoping&Visibility Rules

File file = new File(path, fname); 
FileOutputStream stream = null; 
try 
{ 
stream = new FileOutputStream(file); 
stream.write(tosave.getBytes()); 
} 
finally 
{ 
try 
{ 
    if (null != stream) {stream.close();} 
    return true; 
} 
catch(Exception e){return false;}   
} 

これはコンパイラによって受け入れられました。しかし、私がここに着く前に、私はいくつかの問題にぶつかりました。

  • 最初の試み:キャッチブロックなし。コンパイラは、FileOutputStreamを作成できないという事態に対処したいと思ったので、ボールを再生することを拒否しました。そのストリームに書き込むための同僚。私はこの推論の背後にある論理を理解し、それを好む。
  • 2回目の試み:キャッチブロック...tryブロック内のstream変数を宣言して作成しました。コンパイラが再び揺らぎました - stream変数がfinallyブロックの範囲外です。

私はこの問題を回避するために、ブロックの上にstreamと宣言し、nullに初期化しています。

これは機能します。しかし、ちょうど私のJavaのスキルがどのように私は尋ねると思ったかと思う:正しい方法は、このようなコードを書くにはありますか?

+1

あなたはまだ少ないコード – zencv

+0

、いくつかの砂糖onwards..JustのJava 7でのリソースと試みる使用することができますhttp://docs.oracle.com/javase/tutorial/essential/exceptions /tryResourceClose.html –

答えて

3

現代のJavaバージョン(Java 7以降)でこのようなシナリオを処理するための慣用的な方法は、厄介な終了「ロジック」を扱うブロックtry-with-resourceを使用することです。あなたはまだ例外をキャッチするか、それを上向きに伝播する必要がありますが、これは比較的小さな問題です。考えてみましょう以下:

public static boolean writeToFile(String path, String fname) { 
    File file = new File(path, fname); 
    try (FileOutputStream stream = new FileOutputStream(file)) { 
     stream.write(tosave.getBytes()); 
    } catch (IOException e) { 
     // Should probably log the exception too 
     return false; 
    } 
    return true; 
} 
+0

さまざまな回答をいただきありがとうございます - 私は1つしか受け入れることができません:-)。私はtry-with-resourceブロックを知らなかった。私が最後にJavaをやったのはまだバージョン6になっていたと思います。 – DroidOS

1
あなたは、単にコードスニペットの下に使用することができ

try (FileOutputStream stream = new FileOutputStream(file)){ 
    stream.write(tosave.getBytes()); 
}catch(IOException e) { 
    e.printStackTrace(); 
    return false; 
} 

return true; 

それは7

0

「正しい」方法が使用するJavaで導入された新機能(try-with-resources Statement)ですJava 7のtry with resources。これは長いこと来ていますが、この種の定型コードをきれいに整理しています。以前のバージョンのJava上で立ち往生している場合

タフ運:)

1

は、私はあなたが重要ではないものの上にハングアップして取得していると思います。はい、実際にエラーを修正するために何かをする必要があるため、try/catch/finallyをコーディングすることが重要な場合もあります。

ファイルを開閉するために、コンパイラを満足させるために自分自身をノットにしたくないです。コードの可読性ははるかに重要です。

方法について:

String path="somepath"; 
String fname="somefile"; 
String tosave="somedata"; 
try { 
    File file = new File(path, fname); 
    FileOutputStream stream = new FileOutputStream(file); 
    stream.write(tosave.getBytes()); 
    stream.close(); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
    return false; 
} 
return true; 
+0

あなたのコメントのために私はあなたの答えをアップしています - _コード可読性は非常に重要です - 非常に有効な点です。ここでのコンテキストは、内部ストレージに書き込むAndroid用のPhonegapプラグインですが、私は言及する必要があります。デバイスがファイルの作成/書き込みを拒否しているという確かな機会があると私は思っています。 – DroidOS

+0

ありがとう!私たちは皆、エラーを「キャッチ」するのは簡単だと知っています....しかし、あなたは何をしていますか? –