黑马程序员-异常

---------------------- ASP.Net+Android+IOS开发</a>、 .Net培训、期待与您交流! ----------------------


异常

问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。其实就是Java对不正常情况进行描述后的对象体现


Throwable
    |--Error    //严重错误,无法处理
    |--Exception    //不严重的问题,可以处理
        |--RuntimeException    //运行时异常

异常的处理
try块内,某语句产生异常,其后的语句都不会被执行。异常经常经过处理后,程序会继续向下执行(try块外)

/**
异常的处理
*/

class ExceptionTest
{
    public static void main(String[] args)
    {
        Demo d = new Demo();
        try
        {
            int x = d.div(3, 0);
            System.out.println(x);
        }
        catch(Exception e)
        {
            //jvm默认就是调用printStackTrace()方法
            e.printStackTrace();
        }
    }
}

class Demo
{
    int div(int a, int b)
    {
        return a/b;
    }
}
finally:

关闭资源代码,确保资源的释放

System.exit(0);    //直接退出程序,finally语句块不会执行


编译时异常与运行时异常

异常分两类:
1)编译时被检测的异常,编译时异常
2)编译时不被检测的异常,运行时异常(RuntimeException类及其子类)

对于编译时异常:
只有Java提供了编译时异常,并强制程序处理所有编译时异常,体现了Java的严谨,但为程序员带来了一些烦琐,关于编译时异常时Java领域备受争议的话题

运行时异常:
如果在函数内抛出运行时异常,函数上可以不用声明,编译一样通过
如果在函数上声明了运行时异常,调用该函数可以不用进行处理,编译一样通过

为什么会这样?
因为Java根本就不想让你处理RuntimeException异常(处理指抛出或者try),因为处理异常后,程序会继续执行,当发生RuntimeException异常时,Java希望程序停掉


throw与throws

throw:在方法内抛出异常对象
throw所在的语句块中,throw后不能再有语句,因为执行不到,像return一样,编译会失败

throws:在方法上声明异常,可以有多个异常,用逗号隔开
在方法上声明异常,便于提高安全性,让调用者进行处理,不处理则编译失败,调用声明了异常的方法时,要么throws抛出,要么try处理

/**

*/

class ExceptionTest2
{
    public static void main(String[] args) throws Exception
    {
        Demo d = new Demo();
        int x = d.div(3, 1);
        System.out.println(x);
    }
}

class Demo
{
    int div(int a, int b) throws Exception
    {
        return a/b;
    }
}

多异常处理

声明异常时,建议声明更为具体的异常,这样处理的可以更具体

对方声明几个异常,就对应有几个catch块,不要定义多余的catch块,如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面,否则会编译失败,因为父类异常在最上面,下面的子类异常永远不会得到执行

/**
多异常处理
*/

class ExceptionTest3
{
    public static void main(String[] args)
    {
        Demo d = new Demo();
        try
        {
            int x = d.div(4, 0);
        }
        catch(ArithmeticException e)
        {
            e.printStackTrace();
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
            e.printStackTrace();
        }
    }
}

class Demo
{
    int div(int a, int b) throws ArithmeticException, ArrayIndexOutOfBoundsException
    {
        int[] x = new int[a];
        //可能出现两个异常:角标越界、b为0
        return x[a]/b;
    }
}

自定义异常类

/**
自定义异常类
*/

class ExceptionTest4
{
    public static void main(String[] args)
    {
        Demo d = new Demo();
        try
        {
            int x = d.div(4, 0);
            System.out.println(x);
        }
        catch(NegativeException e)
        {
            e.printStackTrace();
        }

        System.out.println("over");
    }
}

//自定义异常类,继承Exception
class NegativeException extends Exception
{
    NegativeException(String msg)
    {
        super(msg);
    }
}

class Demo
{
    int div(int a, int b) throws NegativeException
    {
        if(b <= 0)
            throw new NegativeException("出现负数了");    //手动抛出自定义异常对象,方法上就要throws声明这个异常
        return a/b;
    }
}

方法重写时的异常特点

如果父类的方法抛出异常,子类的重写方法只能抛出父类方法的异常或者该异常的子类

如果父类方法抛出多个异常,子类的重写方法只能抛出父类异常的子集

如果父类方法没有异常抛出,子类的重写方法也不可以抛出异常,只能try处理异常




---------------------- ASP.Net+Android+IOS开发</a>、 .Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值