2017-03-27 64 views
0

我有這個奇怪的行爲與try 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「的FileInputStream FIS = NULL;然後這一切都變好了..不是沒有初始化相當於初始化爲空的聲明..? 擺脫「範圍錯誤」的另一種方式是當我把「返回;」在catch塊的末尾..不應該代碼運行良好嗎?我可以看到這可能會導致錯誤,但它如何與「fis和fio的範圍外錯誤」相關聯?

回答

0

是不是聲明沒有初始化相當於初始化 爲空?

局部變量需要由程序員只,其中的類的實例變量將被JVM的默認值(基於類型)對象創建過程中初始化被初始化。

擺脫「範圍錯誤」的另一種方法是當我把 「返回」; catch塊的結束..應該不是代碼只是運行 罰款了嗎?

有兩種可能的位置:

(1)綠色通道情況:如果在第一try塊沒有FileNotFoundException,然後fis變量會被初始化成功,所以不會有任何錯誤。

(2)紅路徑場景:fis不會在第一try塊於FileNotFoundException初始化,所以如果從第一catch塊本身你return,再有就是在最後try無需fis變量塊(因爲這些行永遠不會執行,因爲你從中間返回),所以沒有初始化錯誤。

當我把聲明的方法的,讓他們靜它 也適用..你知道什麼是這種區別的原因是什麼?

static變量會由JVM默認值(如實例變量)來初始化,因此,如果您將其標記爲static(JVM已經沒有初始化他們)不會有任何變量初始化錯誤。

+0

確定我看到..感謝..所以在這種情況下,當我把delarations出來的該方法,並使其靜態它也可以工作..你知道這個區別是什麼原因嗎? – Tummomoxie

+0

更新了答案,你可以看看 – developer

+0

你總是需要初始化你的局部變量 – developer

1

是不是聲明沒有初始化相當於初始化 爲空..?

不在局部變量的情況下。只有實例變量在創建實例時被初始化。

擺脫「範圍錯誤」的另一種方法是當我把 「返回」;

您應該使用try with resources塊Java 7中引入它會自動關閉流,如:

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