为什么Findbugs无法检测到我的代码错误?

时间:2014-03-11 23:00:03

标签: java exception findbugs runtimeexception

我已经在findbugs网站http://findbugs.sourceforge.net/bugDescriptions.html

中阅读了错误检测器

我想编写测试代码并使用Findbugs来检测REC错误。 但是虫子不能。为什么?你能帮我解决一下吗?

谢谢,

以下是Findbugs中的描述。

REC:未抛出异常时捕获异常(REC_CATCH_EXCEPTION)

此方法使用捕获异常对象的try-catch块,但不会在try块中抛出异常,并且不会显式捕获RuntimeException。将try {...} catch(Exception e){something}作为捕获许多类型的异常的简写是一种常见的bug模式,每个异常的catch块都是相同的,但是这个构造也意外地捕获了RuntimeException。 ,掩盖潜在的错误。

更好的方法是显式捕获抛出的特定异常,或者显式捕获RuntimeException异常,重新抛出它,然后捕获所有非运行时异常,如下所示:

try {
    ...
} catch (RuntimeException e) {
    throw e;
} catch (Exception e) {
    ... deal with all non-runtime exceptions ...
}

我的代码是:

public static void test1(){

    int A[] = {1,2,3};

    int result = 5/0;//divided by 0
    int arrOut = A[0]+A[4];//index out of bound
    System.out.println(arrOut);
    System.out.println(result);
    try {

    } catch (RuntimeException e) {
        // TODO: handle exception
        System.out.println("Runtimeex throw");
        throw e;
    } catch (Exception e) {
        // TODO: handle exception
        System.out.println("An try error occurred: 0 cannot be divided");
    } 

}

1 个答案:

答案 0 :(得分:3)

try是您要捕获的异常发生的地方。但是,由于它发生在try块之外,catch部分未捕获异常,这就是FindBugs将其报告为无用的try {...} catch {...}代码的原因。正确的代码应如下所示。

int A[] = {1,2,3};

try {
    int result = 5/0;//divided by 0
    int arrOut = A[0]+A[4];//index out of bound
    System.out.println(arrOut);
    System.out.println(result);
} catch (RuntimeException e) {
    // TODO: handle exception
    System.out.println("Runtimeex throw");
    throw e;
} catch (Exception e) {
    // TODO: handle exception
    System.out.println("An try error occurred: 0 cannot be divided");
} 

}