为什么这个try / catch方法不起作用?

时间:2015-05-01 08:50:04

标签: java

FileExaminer(String filename) {
        System.out.println(filename);
        java.io.File file = new java.io.File(filename);
        System.out.println(file);
        Scanner input = null;

    try {
         input = new Scanner(file);
    } catch (FileNotFoundException e) {
        System.out.println("fiel not found" + file);        
    }

    System.out.println(input);
    System.out.println(input.hasNext());

    while(input.hasNextLine()) {
        lines.add(input.nextLine());
    }

    calcluateCharCountAlpha();      
}

我遇到了一个奇怪的问题。这是抛出空指针异常(也是文件未找到异常)。我认为由于某种原因,由于input = null行,线路设置输入到相等文件不起作用。但是,如果我删除= null部分 例如:

Scanner input;

而不是

Scanner input = null;

它说我需要“初始化”变量。 如果我完全删除该行并更改

try {
             input = new Scanner(file);
        } catch

try {
            Scanner input = new Scanner(file);
        } catch

然后无法解析输入

如果我删除上面的内容并试着去做

Scanner input = new Scanner(file);

其中

Scanner input = null;

是。 (不在try / catch块中)它说它需要一个try / catch块。

据我所知。我不能在try / catch中声明输入或在try / catch外部无法访问。

如果我在外面声明它并在try / catch中为它赋值,而没有在try / catch之外赋值,那么它的初始化

如果我在外面声明并在外面指定一个值,并在外部给它一个值将取代try / catch中给出的值

如果我只声明它并在try / catch之外分配它的值,则说它必须在try / catch中。

那么这应该是怎么回事?(这开始变得非常令人沮丧)

3 个答案:

答案 0 :(得分:1)

如果你得到FileNotFoundException,你就不能抓住它,打印错误信息,然后就好像什么也没发生一样。如果抛出该异常,则表示您的input变量未初始化,您无法使用它。

将所有使用input的代码放在try块中会更有意义:

try {
    input = new Scanner(file);
    System.out.println(input);
    System.out.println(input.hasNext());
    while(input.hasNextLine()) {
        lines.add(input.nextLine());
    }
} catch (FileNotFoundException e) {
    System.out.println("file not found" + file);
}

答案 1 :(得分:1)

这个区块有两条路径:

try {
     input = new Scanner(file);
} catch (FileNotFoundException e) {
    System.out.println("file not found" + file);
}

一个是没有例外的路径,另一个是FileNotFoundException时的路径。

第一条路径很好:input在此路径的末尾获得有效的Scanner。但是,第二条路径保持input不变,即设置为null

要解决此问题,请删除try / catch,并让异常传播出构造函数。异常处理的一个非常重要的规则是您的代码不应该捕获它不准备处理的异常。在这种情况下,您的代码无法对丢失的文件执行任何操作,因为fileName来自外部。因此,抛出异常是正确的做法:

FileExaminer(String filename) throws FileNotFoundException {
    ...
    Scanner input = new Scanner(file);
    ...
}

答案 2 :(得分:0)

使用try catch来覆盖方法的所有文件操作部分以捕获错误,并使用catch块中的Exception来捕获所有异常。

试试这个:

FileExaminer(String filename) {

    try {
        System.out.println(filename);
        java.io.File file = new java.io.File(filename);
        System.out.println(file);
        Scanner input = null;


         input = new Scanner(file);



    System.out.println(input);
    System.out.println(input.hasNext());

    while(input.hasNextLine()) {
    lines.add(input.nextLine());
    }

    } catch (Exception ex) {
        System.out.println("Error: "+ ex);

    }
    calcluateCharCountAlpha();      

}