捕获异常并返回自定义消息

时间:2014-01-08 23:21:58

标签: java exception try-catch

所以我做了一些学校作业,如果条件是我的" if"我必须抛出异常。声明得到满足。

public class Fibonacci {
private static final long MAX = 91;

public static long finonacciGetal(int n) {
        if (n > MAX || n < 0) throw new FibonacciException();
        else {

            long eerste = 0;
            long tweede = 1;
            long getal = 0;

            for (int i = 0; i < n; i++) {
                getal = eerste + tweede;
                eerste = tweede;
                tweede = getal;
            }
            return getal;
    }
}

}

现在我做了一个自定义异常,它返回一条错误信息,但它仍然保持打印出栈跟踪。那么有没有办法将它从Exception类本身隐藏起来?因为如果我使用try-catch块它会不断出现返回值的问题,因为赋值使用了局部变量。抛出1 Exception后程序应该停止

提前致谢!

编辑:按要求我的自定义例外

public class FibonacciException extends ArithmeticException {
public FibonacciException() {
    super();
    System.out.println("Max value surpassed");
}

}

2 个答案:

答案 0 :(得分:5)

这样做的确是使用try catch块,因为你提到变量都是本地的,你可能只需将它们放在try catch块之外。

修改

所以,现在我对这个问题有了更详细的了解。我想我明白混乱的来源。如果你得到一个高于你的最大值的迭代,你会被告知抛出一个异常,这是一个很好的方法,但现在你需要一种方法来处理这个异常项。

所以,让我们拿你的原始代码:

public class Fibonacci {
private static final long MAX = 91;

public static long finonacciGetal(int n) {
        if (n > MAX || n < 0) throw new FibonacciException();
        else {

            long eerste = 0;
            long tweede = 1;
            long getal = 0;

            for (int i = 0; i < n; i++) {
                getal = eerste + tweede;
                eerste = tweede;
                tweede = getal;
            }
            return getal;
    }
}
}

这很好,真的。现在,如果你看一下抛出异常的情况,你的局部变量中没有任何值被计算出来,这是因为,这个异常意味着有人试图将这个方法与值一起使用这超出了你允许的范围。确保正在使用此类的人处理异常的一种方法是在方法声明中添加throws子句,如下所示:

public class Fibonacci {
private static final long MAX = 91;

public static long finonacciGetal(int n) throws FibonacciException {
        if (n > MAX || n < 0) throw new FibonacciException();
        else {

            long eerste = 0;
            long tweede = 1;
            long getal = 0;

            for (int i = 0; i < n; i++) {
                getal = eerste + tweede;
                eerste = tweede;
                tweede = getal;
            }
            return getal;
    }
}
}

那样的话,有人去使用它(比如说,主要的)就像这样:

public static void main(String[] args) {
    try{
        System.out.println(new Fibonacci().fibonacciGetal(92));
    }catch(FibonacciException e){
        System.out.println(e.getMessage());
    }
}

你会注意到你必须在使用它的方法中使用try / catch,这是处理这些情况的正确方法。

答案 1 :(得分:0)

只需更新您的例外,以便邮件是消息:

public class FibonacciException
extends ArithmeticException {

    public FibonacciException() {
        super("Max value surpassed");
    }
}

您的方法的调用者将执行以下操作:

try {
    long f = finonacciGetal(-1);

} catch(FibonacciException fe) {

    // prints something like
    // "com.acme.FibonacciException: Max value surpassed"

    System.err.println(fe); 
}

现在它会自动打印堆栈跟踪,因为您没有捕获它。当您捕获异常时,您可以决定该怎么做,而这取决于您的方法的调用者。你不必担心那部分。你的任务只是抛出异常。