异常处理,最后在java中阻塞

时间:2013-08-27 08:44:36

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

public class Confusion {
    Confusion(int i) {
        int j = 5;
        int[] a = new int[2];
        try {
            a[0] = 4;
            if (i <= 0) {
                int k = j / i;
            } else {
                System.out.println(j / i);
            }
        } catch (ArithmeticException sa) {
            System.out.println("Wrong value" + sa);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("out of range massage in Class");
        } finally {
            System.out.println("Executing finally block in code");
        }
    }

    void k() {
        int[] a = new int[2];
        {
            try {
                a[4] = 4;
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("out of range");
            }
        }
    }
}

public class Nested {
    public static void main(String[] args) {
        Confusion c = new Confusion(2);
        Confusion c1 = new Confusion(0);
        c1.k();
        c.k();
    }
}

输出:

-2
Executing finally block in code
Wrong valuejava.lang.ArithmeticException: / by zero
Executing finally block in code
out of range
out of range

每当我执行下面代码中写的finally{}块时,它都会被执行两次。不知道为什么会这样。我想只运行一次finally块。 有没有办法在单个方法中抛出多个异常?

7 个答案:

答案 0 :(得分:3)

因为你有两个Confusion个对象。因此,构造函数将被执行两次。

confusion c=new confusion(2);
confusion c1=new confusion(0);

答案 1 :(得分:2)

confusion c=new confusion(2);
confusion c1=new confusion(0);

这就是为什么你从最后得到2个输出。

答案 2 :(得分:1)

这是因为您要创建两个对象c1c

答案 3 :(得分:1)

  

当try块退出时,finally块始终执行。

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

因此无论如何都会执行finally块。当你创建两个对象时,它会调用构造函数两次,最后也会执行两次。

答案 4 :(得分:1)

您正在尝试两次代码。

confusion c=new confusion(2);
confusion c1=new confusion(0);

这意味着每次调用try时最终都会发生,它会打印...

Executing finally block in code

如果你再次打电话,

confusion c1=new confusion(3);

最后第三次打印出内容。

答案 5 :(得分:1)

您正在使用以下代码创建两个对象。这就是为什么finally块被执行两次。

confusion c=new confusion(2);
confusion c1=new confusion(0);

请试试这个

public static void main(String[] args){
   confusion c=new confusion(2);
   confusion c1=new confusion(0);
   confusion c1=new confusion(10);
   confusion c1=new confusion(5);
} 

现在终于阻止了4次。

Java中的构造函数是在创建对象时执行的代码块。

请阅读构造函数参考http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

答案 6 :(得分:0)

因为您正在创建两个Confusion对象。因此,finally块将被执行两次。

confusion c=new confusion(2);
confusion c1=new confusion(0);

如果你想最后只执行一次。试试这段代码

 public class Confusion {
    Confusion(int i) {
        int j = 5;
        int[] a = new int[2];
        a[0] = 4;
        if (i <= 0) {
           int k = j / i;
        } else {
           System.out.println(j / i);
        }
    }

    void k() {
       int[] a = new int[2];
            a[4] = 4;
   }
}

public class Nested {
   public static void main(String[] args) {
      try{
           Confusion c = new Confusion(2);
           Confusion c1 = new Confusion(0);
           c1.k();
           c.k();
         }catch (ArithmeticException sa) {
            System.out.println("Wrong value" + sa);
         } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("out of range massage in Class");
        } finally {
            System.out.println("Executing finally block in code");
        }
     }
  }