有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

所以我正在做一些学校作业,如果我的“如果”语句之间的条件满足,我必须抛出一个例外

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;
    }
}

}

现在我做了一个自定义异常,它返回一条错误消息,但它仍然保持打印stacktrace。那么,有没有办法对异常类本身隐藏它呢?因为如果我使用try-catch块,返回值就会出现问题,因为赋值使用了局部变量。程序应在引发1个异常后停止

提前谢谢

编辑:根据请求,我的自定义异常

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

}


共 (2) 个答案

  1. # 1 楼答案

    这样做的诀窍确实是使用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;
        }
    }
    }
    

    这样,当有人这样使用它时(比如说,main):

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

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

  2. # 2 楼答案

    只需更新您的异常,使消息成为以下消息:

    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); 
    }
    

    现在它会自动打印堆栈跟踪,因为您无法捕获它。当捕捉到异常时,您可以决定如何处理它,这取决于方法的调用方。你不必担心那部分。您的任务只是抛出异常