返回Catch Statement

时间:2014-08-08 23:09:28

标签: java return try-catch

在以下程序中,如果我从:

中删除return语句
catch(FileNotFoundException e) { 
        System.out.println("File Not Found"); 
        return; 

它在do while循环中显示一个错误,即局部变量fin可能尚未初始化。有人能解释我为什么会这样吗?

import java.io.*; 
class Stock { 
    public static void main(String args[]) 
            throws IOException { 
        int i; 
        FileInputStream fin; 
        try { 
            fin = new FileInputStream(args[0]); 
        } catch(FileNotFoundException e) { 
            System.out.println("File Not Found"); 
            return; 
        } 
        // read characters until EOF is encountered 
        do { 
            i = fin.read(); 
            if(i != -1) System.out.print((char) i); 
        } while(i != -1); 
            fin.close(); 
        } 
}

5 个答案:

答案 0 :(得分:3)

如果删除return语句,则会获得:

public static void main(String args[]) 
        throws IOException { 
    int i; 
    FileInputStream fin; 
    try { 
        fin = new FileInputStream(args[0]); 
    } catch(FileNotFoundException e) { 
        System.out.println("File Not Found"); 
    } 
    // read characters until EOF is encountered 
    do { 
        i = fin.read(); 
        if(i != -1) System.out.print((char) i); 
    } while(i != -1); 
        fin.close(); 
    } 

现在,如果FileInputStream抛出异常,则不会返回结果,并且fin不会被初始化。 catch块处理异常并打印消息,但随后代码继续,它尝试执行的下一个操作是i = fin.read()。由于编译器发现在没有初始化fin或为其分配任何内容的情况下有可能获得此语句,因此它不会编译该程序。

如果您重新插入return,则不会发生这种情况,因为catch阻止会导致main返回,而您无法访问fin.read() }。

答案 1 :(得分:1)

可能在try块中的调用中抛出异常,因此不会为变量fin分配任何值。如果没有return语句,后续使用未初始化的fin变量会导致编译器抱怨。

使用return语句,如果fin变量从未被初始化,它也永远不会被使用,所以编译器就可以了。

答案 2 :(得分:1)

为什么编译器抱怨

-  if your main() encounter the exceptions it will pass try catch block and never get the 
    chance to initialize fin variable  
 -  Compiler knows that program may end up with throwing an exception which has high chance
    in order to avoid any fruther issue it will not complie

我建议你这样做

 - use try catch block with resources since Java 7 since Class `FileInputStream` is     `closable`
  - put everything in a good order 

代码:

try(FileInputStream fin =new FileInputStream(args[0]) ) { 
          while ((content = fin.read()) != -1) {
            // convert to char and display it
            System.out.print((char) content);
        }
        } catch(FileNotFoundException e) { 
            System.out.println("File Not Found"); 
            return; 
        } ...
....
..

来源:

http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html

http://tutorials.jenkov.com/java-exception-handling/try-with-resources.html

答案 3 :(得分:0)

new FileInputStream(args[0]);可能会发生异常,这会导致fin未初始化。

尝试使用fin的默认值:

fin = null;

然后,检查以确保它不为空:

if (fin != null)
{
   do { 
       i = fin.read(); 
       if(i != -1) System.out.print((char) i); 
      } while(i != -1); 
      fin.close(); 
} 

答案 4 :(得分:0)

如果在实例化FileInputStream时遇到异常,则在将值存储在变量fin中之前,控制将移动到catch块。如果没有return语句,程序将继续执行do / while循环,其中将在未初始化的变量上调用方法(读取),从而导致错误。