2017-03-27 22 views
0

try catchブロックでこの奇妙な動作があります。私はその中の変数を初期化するとき、彼らは私がnullに変数を宣言するときに奇妙なことがFileInputStreamのFIS =ヌル」である 範囲外のcatchブロック変数を試してください

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 



public class CopyFile { 
    public static void main(String[] args) { 
     FileInputStream fis; 
     FileOutputStream fos; 
     args[0] = "somefile.txt"; 
     args[1] = "copyithere.txt"; 
     int i; 

     try { 
      try { 
       fis = new FileInputStream(args[0]); 
      } catch (FileNotFoundException e) { 
       System.out.println("Input file not found"); 
       e.getMessage(); 
      } 
      try { 
       fos = new FileOutputStream(args[1]); 
      } catch (FileNotFoundException e) { 
       System.out.println("Output file not found"); 
       e.printStackTrace(); 

      } 
     } catch (ArrayIndexOutOfBoundsException e) { 
      System.out.println("Give input and output file name"); 
      e.getStackTrace(); 

     } 
     try { 
      do { 
       i = fis.read(); 
       fos.write(i); 
      } while (i != -1); 

     } catch (IOException e) { 
      System.out.println("Some IO exception"); 
      e.getMessage(); 
     } 

    } 
} 

..私は外でそれらを宣言していても、次のコードの範囲外であると思われ、その後、それはすべて正常になります.. nullへの初期化に相当する初期化なしの宣言ではありません..? "範囲外のエラー"を取り除く他の方法は、catchブロックの最後に "return;"を置くときです。コードはちょうどそれを使ってうまく走ってはいけないのですか?私はそれがどのようにしてエラーを起こすかを見ることができますが、これはfisとfioの「範囲外のエラー?

答えて

0

初期化に相当する初期化なしの宣言がありません nullにするには?

ローカル変数は、クラスのインスタンス変数は、オブジェクトの作成時に(タイプに基づく)はそのデフォルトの値をJVMによって初期化されるように、プログラマだけ、によって初期化する必要があります。

「範囲外のエラー」を取り除く別の方法は、私が を「返す」とした場合です。キャッチブロックの終わりに..コードはちょうど を実行してはいけませんか?

ここでは二つの可能性があります。

(1)グリーンパスシナリオは:何FileNotFoundExceptionは最初tryブロック内に存在しない場合、その後、fis変数が正常に初期化されていたので、そこではありませんエラー。

(2)レッドパスシナリオ:fisは最初tryブロックにFileNotFoundException時に初期化されることはありませんので、最初catchブロック自体からあなたreturn場合は、最後のtryfis変数の必要はありませんこれらの行は途中から戻るため実行されないため、初期化エラーは発生しません。

私が宣言を取り除いて静的にすると、 も動作します。この区別の理由は何ですか?

static変数は、JVMによって(インスタンス変数のような)デフォルト値で初期化されますので、あなたがstaticとしてマークした場合(JVMはすでにそれらを初期化しました)任意の変数の初期化エラーが発生することはありません。

+0

[OK]を私は外のdelarationsを取るとき、私は..ので、この場合には..感謝を見ます方法と静的にもそれは動作します..あなたはこの区別の理由は何ですか? – Tummomoxie

+0

答えが更新されました – developer

+0

あなたはいつもあなたのローカル変数を初期化する必要があります – developer

1

初期化に相当する初期化なしの宣言がありません null ...?

ローカル変数の場合はありません。インスタンスが作成されると、インスタンス変数のみが初期化されます。

「範囲外のエラー」を取り除く別の方法は、私が を「返す」とした場合です。

あなたはそれが自動的例えば、ストリームをクローズするJava 7で導入されたtry with resourcesブロックを使用する必要があります。

int i; 
try(FileInputStream fis = new FileInputStream(args[0]); 
     FileOutputStream fos = new FileOutputStream(args[1]);){ 
    do { 
     i = fis.read(); 
     fos.write(i); 
    } while (i != -1); 
} 
+0

ヒントのためにありがとう;) – Tummomoxie

関連する問題