2013-03-07 82 views
5
public static int howMany(String FileName) 
{ 
    BufferedReader br = null; 

    try 
    { 
     FileInputStream fis = new FileInputStream(FileName); 
     DataInputStream dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.print("FILE DOESN'T EXIST"); 
    } 
    finally 
    { 
     fis.close(); 
     dis.close(); 
     br.close(); 
    } 


    String input; 
    int count = 0; 

    try 
    { 

     while ((input = br.readLine()) != null) 
     { 
      count++; 
     } 

    } 
    catch (IOException e) 
    { 
     System.out.print("I/O STREAM EXCEPTION"); 
    } 


    return count; 
} 

由于某种原因,我无法关闭任何I/O对象。即使我导入了所有的I/O库(import java.io. *;)并启动了所有对象,fis.close(),dis.close(),br.close()也都找不到符号。尝试关闭I/O对象时出现“找不到符号”

+0

hurr我得到错误:未报告的异常IOException;必须被捕获或声明现在抛出3次 – 2013-03-07 21:27:52

回答

5
BufferedReader br = null; 
FileInputStream fis =null; 
DataInputStream dis null; 
try { 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 

把它们放在你的try block之外,这样你的finally块可以看到变量。

+0

hurr我得到错误:未报告的异常IOException;必须被捕获或声明现在抛出3次 – 2013-03-07 21:26:58

+0

@MatthewLoch放置另一个catch块并捕获IOException。但确保你的catch hirarchey是catch(FileNotFound){} catch(IOException) – PermGenError 2013-03-07 21:30:09

+0

修复它从不知道 – 2013-03-07 21:56:12

1

您必须声明try块外所有流,否则他们将不会在finally块可见:

FileInputStream fis = null; 
DataInputStream dis = null; 
BufferedReader br = null; 

或者,你可以使用Java 7的新try-with-resources语法自动化资源收盘。

1

你的对象是你的块中被空

FileInputStream fis =null; 
DataInputStream dis null; 

定义它们的块这样的事情

try{ 

    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 

    } 
0

你作用域fis到try块内,因此最后不知道外面在那。尝试:

FileInputStream fis; 
DataInputStream dis; 
try 
    { 
     fis = new FileInputStream(FileName); 
     dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
0

试试这个:

BufferedReader br = null; 
FileInputStream fis = null; 
DataInputStream dis = null; 
try 
{ 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 
0

编译器抱怨你在finally块引用变量不在范围在这一点上,这对现有的回答充分覆盖。但是,这里还有很多其他问题。

这里的一个大问题是,你试图在关闭BufferedReader后引用它。将计数逻辑移入第一个尝试块并摆脱第二个。

当您结合阅读器和流如您的示例中,只有最外面的一个需要关闭。 BufferedReader保存对传入其中的读者的引用,并确保它在关闭时被关闭。同样,InputStreamReader将关闭传递给它的输入流,这将关闭传递给它的fileInputStream。

的FIS和DIS变量,甚至没有必要,你可以嵌套调用构造函数:

br = new BufferedReader(new InputStreamReader(
     new DataInputStream(new FileInputStream(FileName)))); 

把一个以上的接近finally块是坏的;如果发生异常时关闭其中一个,则剩余资源不会关闭。

此外,在finally块中抛出的异常将掩盖try块中抛出的任何异常。原始异常(包含有关出错的信息)将被丢弃,并且关闭时引发的异常(不提供信息)将被传播。

这将是一种改进,可以检查试用资源,该资源旨在处理关闭多个资源并消除异常屏蔽的可能性。

相关问题