2013-06-01 38 views
0

我在编写我的应用程序时遇到了相当麻烦。这是我的问题:正在初始化Try/Catch

我试图初始化像这样的文件输入流:

FileInputStream fis 
fis = openFileInput(selectedFile); 

再后来就把这1行:

byte[] input = new byte[fis.available()]; 

问题是代码的两个位需要尝试/ catch语句,第二个块无法识别fis,因为它是在try/catch中初始化的。这里是我的代码:

private void openFile(String selectedFile) { 
     String value = ""; 
     FileInputStream fis; 
     try { 
      fis = openFileInput(selectedFile); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 


     try { 
      byte[] input = new byte[fis.available()]; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

我该怎么办? (在此先感谢)

+0

初始化FIS到临时值(如果你尝试'null'它会工作)。事情是,这就是程序应该如何工作。 –

+2

在try/catch之外声明变量,或者捕获这两个异常。 –

+0

您尝试打开该文件,如果失败,则只打印堆栈跟踪并尝试继续......这将产生一个NPE。让你的'openFile()'方法至少抛出'IOException'! – fge

回答

0

设置FileInputStream fis = null;当您第一次声明该变量。

你也可以像这样运行你的代码,因为IOException也会捕获找不到的文件异常。

String value = ""; 
FileInputStream fis; 
try { 
    fis = openFileInput(selectedFile); 
    byte[] input = new byte[fis.available()]; 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

您也可能希望在第一个异常之后返回,或者在第二个块中添加空检查。 – kcoppock

+0

非常感谢!我会将您的答案标记为正确,但我需要12分钟以上 –

+0

我做了一个小小的编辑,为您提供了修复代码的另一种方法。 –

0

将FileInputStream设置为临时值。 null将是最好的选择,如:

FileInputStream fis = null; 

这样做的原因是因为如果你的try语句抛出一个错误,那么FIS将永远不会我初始化。那么你会遇到问题。如果你没有完全退出这个东西,你还应该在try/catch块之后添加语句来测试这个值是否为空,以便程序不会抛出空指针异常。

因此,也许是这样的:

if(fis == null) { 
    return; // Which will just end the method. 
} 

可能还希望把尝试/捕捉到一起(你还是应该申报其他的东西的尝试之​​外,至少任何你打算以后直接使用代码),但它也许会是更有效的编码方式),如:

FileInputStream fis = null; 
byte[] input = null; 
try { 
    fis = openFileInput(selectedFile); 
    input = new byte[fis.available()]; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
1

在这种情况下,最好的办法是不要赶IOException异常都没有。

private void openFile(String selectedFile) throws IOException { 
     FileInputStream fis = openFileInput(selectedFile); 
     byte[] input = new byte[fis.available()]; 

它没有任何意义,继续你有FileNotFoundException异常后

+0

不要忘记,你需要关闭finally块上的输入流,所以即使这样也应该被'try/finally'包围。 –