异常处理;试着抓

时间:2011-10-17 04:40:43

标签: java oop exception-handling try-catch-finally

这是我的代码:

class FinallyDemo {
    static void myMethod(int n) throws Exception{
        try {
            switch(n) {
                case 1: 
                    System.out.println("1st case");
                    return;
                case 3: 
                    System.out.println("3rd case");
                    throw new RuntimeException("3!");
                case 4: 
                    System.out.println("4th case");
                    throw new Exception("4!");
                case 2: 
                    System.out.println("2nd case");
            }
        catch (RuntimeException e) {
            System.out.print("RuntimeException: ");
            System.out.println(e.getMessage());
        } finally {
            System.out.println("try-block entered.");
        }
    }

    public static void main(String args[]){
        for (int i=1; i<=4; i++) {
            try {
                FinallyDemo.myMethod(i);
            } catch (Exception e){
                System.out.print("Exception caught: ");
                System.out.println(e.getMessage());
            }
            System.out.println();
        }
    }
}

现在,它不会这样工作:

如果我在方法本身中有一个try和catch块,那么我不需要写

method_name(int n) throws Exception

在抛出异常的方法中没有try-catch块阻止在抛出异常的方法中写“抛出异常”吗?

7 个答案:

答案 0 :(得分:3)

在您的示例中,case 4抛出异常,而在catch中只是捕获RuntimeException。由于没有异常的catch,你的方法需要声明它抛出Exception。 如果要为Exception添加catch,则不需要抛出Exception。这将有效。

static void myMethod(int n) {
    try {
        switch (n) {
            case 1:
                System.out.println("1st case");
                return;
            case 3:
                System.out.println("3rd case");
                throw new RuntimeException("3!");
            case 4:
                System.out.println("4th case");
                throw new Exception("4!");
            case 2:
                System.out.println("2nd case");
        }
    } catch (RuntimeException e) {
        System.out.print("RuntimeException: ");
        System.out.println(e.getMessage());
    } catch (Exception e) {
        System.out.print("Exception: ");
        System.out.println(e.getMessage());
    } 
    finally {
        System.out.println("try-block entered.");
    }
}

答案 1 :(得分:1)

当且仅当被捕获的异常类型被捕获时(或者如果它扩展throws),您不需要RuntimeException子句。在您的情况下,您抛出Exception使用语句throw new Exception("4!");,但只捕获类型RuntimeException

如果为Exception添加catch块,则不再需要throws子句。例如:

static void myMethod(int n) throws Exception{
    try {
        switch(n) {
        case 1: 
            System.out.println("1st case");
            return;
        case 3: 
            System.out.println("3rd case");
            throw new RuntimeException("3!");
        case 4: 
            System.out.println("4th case");
            throw new Exception("4!");
        case 2: 
            System.out.println("2nd case");
        }
    } catch (RuntimeException e) {
        System.out.print("RuntimeException: ");
        System.out.println(e.getMessage());
    } catch(Exception e) {
        System.out.print("Exception: ");
        System.out.println(e.getMessage());
    } finally {
        System.out.println("try-block entered.");
    }
}

答案 2 :(得分:1)

是的,前提是您正在捕获该方法可以抛出的所有异常类型。

在您的代码中,您抛出一个Exception但不为其提供catch块(您只捕获RuntimeException),因此您必须将您的方法声明为throw {{ 1}}

你需要:

Exception

答案 3 :(得分:0)

  

在抛出异常的方法中没有try-catch块阻止在抛出异常的方法中写“抛出异常”吗?

不,你总是可以声明抛出异常,即使你不这样做。

除此之外,这对于允许子类抛出它们很有用(因为它们不允许添加额外的throw子句)。它还允许您稍后更改实现而不更改异常接口。

答案 4 :(得分:0)

现在是两类例外

  1. 例外的子类。
  2. RuntimeException的Subclasess
  3. Exception的子类被称为已检查异常,编译器确保在try / catch块中或通过修饰符在方法上抛出异常(或子类)来管理它们。

    runlaseException的子类化被称为未经检查的异常,编译不需要任何管理它的机制。

    现在,如果在方法上使用修饰符抛出异常(或子类),编译器将要求您使用try / catch管理它。

答案 5 :(得分:0)

由于您在交换机中同时抛出RuntimeExceptionException,您需要同时捕获两者或方法需要抛出Exception,以便可以在方法中处理它致电myMethod

要同时使用:

catch (RuntimeException e) {
        System.out.print("RuntimeException: ");
        System.out.println(e.getMessage());
}catch (Exception e) {
        System.out.print("Exception: ");
        System.out.println(e.getMessage());
}

确保Exception的捕获始终为最后一个,否则它将跟踪RuntimeException,因为它延伸Exception

答案 6 :(得分:0)

您正在以两种方式处理异常。首先,如果扩展直接调用Exception类,就像在声明方法

时那样
method_name(int n) throws Exception

这意味着无论在方法中发生什么类型的异常,它总是能够捕获它,例如,如果在方法内部发生了算术异常或NullPointerException或ArrayIndexOutOfBoundsException,您的上述声明将能够抓住他们每一个人。因此,没有将try catch块放在该方法中的实际目的,因为即使RunTimeException也是Exception Class层次结构的一部分。 因此,如果我正确理解你的问题,程序将执行,然后从catch块中捕获异常,否则它将从方法声明中捕获它。 希望它能回答你的问题。