Java中的异常处理

异常:在程序运行中出现的不正常情况,在Java中,异常会被以类的形式被描述,在现实的程序中,如果出现了异常,会在相应位置生成相应的异常对象。

在Java中,提供特有的方法进行处理。(try-catch+finally),先不考虑finally

格式:

try
{
    需要被检测的代码;
}
catch(异常类型 e) 
{
    处理异常的代码(处理异常的方式)
}
class Demo
{
    public static int div(int a,int b)
    {
        return a/b;//这个函数有个漏洞,就是b不可以为0,如果b为0,会出现除零异常
    }
    public static void main(String[] args)
    {
        try
        {
            System.out.println("捕获异常");
            div(4,0);
            System.out.println("捕获异常");

        }
        catch(Exception e)//Exception是所有异常的父类,这里使用了多态
        {
            System.out.println("有异常");
        }
        System.out.println("over");
    }
}
===========================================================================
如果捕获异常,而且不用try-catch,那么程序会在异常出现的地方终止,也就是说输出over不能执行。
在try代码块中,一旦抓到异常就不再执行代码块,并把错误传给catch的形参,也就是说
输出捕获异常只执行一次。
=============================================================================================================

在方法中使用throws和throw抛出异常。

先讲throws;throws是用来声明异常方法的。比如你在一个方法中发现漏洞,可能导致程序异常时,可以把该方法声明为异常,不一定是Exception类,可以使其子类(具体的异常),并且可以声明多异常,一旦被声明为异常后,调用者(上一级)就必须在调用处使用try-catch来捕获,或者使用throw抛出给上一级,不过用使用throw抛出时,必须要在相应的地方用throws声明一下(RuntimeException及其子类除外),换句话说,只要执行完后,有向上一层抛出异常的,就必须用throws。

throw,是用来抛出异常对象的,格式:throw new 异常名();只要含有throw的方法必须要被throws声明,throw多用于自定义异常(后面讲)。

class ExceptionDemo
{
    int div(int a,int b) throws ArithmeticException//ArithmeticException包含除零异常
    {
        //if(b==0)
            //throw new ArithmeticException();//由于这是系统自带异常,所以抛出语句可省略,如果是自定义的异常不能省略
        return a/b;
    }
}
class Demo 
{
    public static void main(String[] args)
    {
        ExceptionDemo d=new ExceptionDemo();
        try//因为有调用div方法,而且该方法被申明为异常,所以要用try捕获
        {
            d.div(4,0);
        }
        catch(ArithmeticException e)
        {
            System.out.println("除零异常");
        }
    }
}
======================================================================
如果主函数也无法不处理的话,要在相应位置使用throw 抛出异常
main() throws ArithmeticException//再次抛出时,异常类型可变
{
    ExceptionDemo d=new ExceptionDemo();
    try
    {
        d.div(4,0);
    }
    catch(ArithmeticException e)
    {
        throw new ArithmeticException();//这时已把异常抛出给虚拟机了就不能再抛出了,而是由虚拟机自带的异常处理机制去处理
    }
}
如果方法声明了多个异常的话,相应位置就会有多个catch(try只有一个),不过异常处理只能处理一个,因为try一旦抓到就不执行后面语句,而且一旦处理就不再看后面的catch,要注意的是catch语句是从上而下地执行,不能存在多余的catch语句,所以父类下面不能有子类异常,因为子类异常会在父类异常的catch中被处理,再写子类异常就多余了,会导致编译不过。

例如:

class ExceptionDemo
{
    int div(int a,int b) throws ArithmeticException,RuntimeException//多异常
    {
        if(b==0)
            throw new ArithmeticException();
        return a/b;
    }
}
class Demo 
{
    public static void main(String[] args)
    {
        ExceptionDemo d=new ExceptionDemo();
        try
        {
            d.div(4,0);
        }
        //RuntimeException是ArithmeticException的父类
        catch(ArithmeticException e)
        {
            System.out.println("除零异常");
        }
        catch(RuntimeException e)
        {
            System.out.println("运行异常");
        }
    }
}

==============================================================================================================================

异常处理中常用方法:getMessage(),toString(),printStackTrace()

解释之前先介绍一下所有异常的父类Exception

在Exception中有一个关键的成员message,子类异常通过继承,使用message来记录各个异常的性质,也就是告诉别人这是什么异常。

并且在Exception中有一个构造函数Exception(String message)就是用来初始化成员message的

getMessage():就是输出各个异常的message

toString():输出异常名字及其message

printStackTrace():指出异常的名字,message,栈层次和异常在程序的位置

=============================================================================================================================

在异常的处理过程中要有分层的思想,当处理完异常时应该继续向上层抛出异常,而且在抛出异常时应注意抛出的异常应该是上层能够处理或者说上层能够识别的。比如销售人员向商家取货,结果商家去仓库是发现货物发霉了,然后商家处理完发霉的货物后,应该向销售人员反馈(就好比抛出异常),但是,商家不可能跟销售人员说货物发霉了,而应该说没货,因为说货发霉了,销售人员又不会处理,销售人员只关心有没有货(就好比只能处理没货这类异常),所以在抛出时应注意上层是否能够处理或识别异常。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值