黑马程序员技术交流社区

标题: 异常_06 [打印本页]

作者: Tauruszzy    时间: 2015-5-9 14:48
标题: 异常_06
/*
当可能产生的异常不止一个时可以采用多异常处理方式,下面就是一个多异常处理
*/
class Demo
{
        int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException
        {
                int[] arr=new int[a];
                System.out.println("数组的第一个元素是:"+arr[0]);//第2处
                return a/b;
        }
}

class ExceptionDemo
{
        public static void main(String[]args)
        {
                Demo d=new Demo();
                try
                {
                        int x =d.div(4,1);//第一处
                    System.out.println("x="+x);
                }
                catch(ArithmeticException e)
                {
            System.out.println(e.toString());
            System.out.println("运算错误");
                }
                catch (ArrayIndexOutOfBoundsException e)
                {
                        System.out.println(e.toString());
                        System.out.println("数组越界");
                }
                System.out.println("over");
        }
}
备注:因为程序没有错误,所以不执行catch语句,直接输出:
数组的第一个元素是:0
x=4
over

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*
别的地方不动,只把上面的第一处改为int x =d.div(4,0);程序输出:
数组的第一个元素是:0
java.lang.ArithmeticException:/ by zero
运算错误
over
*/
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*
如果把第2处改为System.out.println("数组的第一个元素是:"+arr[4]);,则程序显示:
java.lang.ArrayIndexOutOfBoundsExceptionException:
数组越界
over
*/
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*
两个catch不会同时执行,因为当在下列程序
int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException
        {
                int[] arr=new int[a];
                System.out.println("数组的第一个元素是:"+arr[0]);//第2处
                return a/b;
        }
中产生错误的时候,虚拟机会跳转到相对应的try中进而执行相对应的catch语句
*/

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class Demo
{
        int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException
        {
                int[] arr=new int[a];
                System.out.println("数组的第一个元素是:"+arr[4]);
                return a/b;
        }
}

class ExceptionDemo
{
        public static void main(String[]args)
        {
                Demo d=new Demo();
                try
                {
                        int x =d.div(4,1);
                    System.out.println("x="+x);
                }
                catch(Exception e)//这个的出现导致下面两个catch语句的多余,程序会报错
                {
            System.out.println(e.toString());
            System.out.println("我是Exception!!!");
                }
                catch(ArithmeticException e)
                {
            System.out.println(e.toString());
            System.out.println("运算错误");
                }
                catch (ArrayIndexOutOfBoundsException e)
                {
                        System.out.println(e.toString());
                        System.out.println("数组越界");
                }
                System.out.println("over");
        }
}
备注:当执行上面语句的时候,会提示错误,错误信息的意思是已捕获到错误信息ArrayIndexOutOfBoundsExceptionException和 ArithmeticException,这是因为这两个类是Exception类的子类,父类中已经封装了这两个子类的对象,再定义两个子类对象多余。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class Demo
{
        int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException
        {
                int[] arr=new int[a];
                System.out.println("数组的第一个元素是:"+arr[4]);
                return a/b;
        }
}

class ExceptionDemo
{
        public static void main(String[]args)
        {
                Demo d=new Demo();
                try
                {
                        int x =d.div(4,1);
                    System.out.println("x="+x);
                }
               
                catch(ArithmeticException e)
                {
            System.out.println(e.toString());
            System.out.println("运算错误");
                }
                catch (ArrayIndexOutOfBoundsException e)
                {
                        System.out.println(e.toString());
                        System.out.println("数组越界");
                }
                catch(Exception e)//这个catch语句不会执行,因为上面有更为详细的对象执行
                {
            System.out.println(e.toString());
            System.out.println("我是Exception!!!");
                }
                System.out.println("over");
        }
}
备注:注意这个情况

----------------------
----------------------
总结:在定义异常的时候要定义的尽量具体,因为更容易发现错误,给出提示。
         声明有几个异常,就应有几个catch块。不要定义多余的catch块。
         如果多个catch块中的异常出现继承关系,子类异常catch块放在上面,父类异常catch块放在最下面。
         建议在异常catch块中定义具体的处理方式。

作者: Dracove    时间: 2015-5-9 16:04
总结的不错,加油!
作者: Tauruszzy    时间: 2015-5-9 22:29
Dracove 发表于 2015-5-9 16:04
总结的不错,加油!

谢谢鼓励,共勉
作者: lingdu    时间: 2015-5-9 22:36
学习了,不错




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2