Java-异常

目录

异常

异常的使用例1

异常的分类

异常的使用例2

为什么需要异常

throws与throw

finally

注意事项

异常的优缺点


异常

异常不是错误。异常是编译能过,但在程序运行时出错。

异常的使用例1

我们可以用try...catch结构来抓取这个异常。try中写可能出现异常的代码,catch抓取错误类型并给出处理措施。

如果不加异常处理,程序就不会输出“嘿嘿!”,而是提前终止。C语言中是没有这个功能的,出错就崩溃,不能继续执行下面的程序。

在这个例子中Java程序在执行到第15行代码时会调用divide,当运行到第6行代码时,虚拟机就会抛出一个异常对象,然后寻找这行代码附近有没有处理异常的try...catch结构,此时没有找到,于是程序从第6行返回到第15行,又抛出一个异常对象,之后再看看这附近有没有处理异常的代码,找到之后就进行异常处理,然后正常执行下面的程序。如果第15行附近还是没有找到,程序就会将这个异常对象提交给虚拟机,然后虚拟机就会立即终止程序,将出错信息在屏幕上打印出来。catch中的ArithmeticException是一个异常类,e就是这个类的对象,用来接收虚拟机抛出的异常对象。可以用e.printStackTrace();输出异常的具体信息。

异常的分类

(1)Error是系统错误,程序员无法处理。(2)Expection是程序员可以捕获并处理的异常。(3)RuntimeExpection的子类异常是可以处理也可以不处理的异常。(4)继承自Expection但不是RuntimeExpection的子类的异常,程序员必须捕获并处理。

程序运行中抛出的所有异常类型都是Expection的子类,子类中又有一个RuntimeExpection。如果不知道程序会抛出什么异常,写个Expection e就OK。如果异常类型写错,是捕获不到的。

异常的使用例2

编译器认为在try中的语句都有可能运行不正确,在编译时会按照假设不能运行的情况的来处理,会产生报错error。

变量m写在catch中,因此编译器认为它有可能不会执行,后面输出m时就会显示没有初始化m的错误。

如果在try中初始化一个变量,下面的程序还使用这个变量,那么编译器就会认为这个变量没有被定义而使用,从而报错。

为什么需要异常

用try...catch而不用if,列举一种情况,当我们无法知道用户输入的是什么类型的数据时,没办法用if将这些数据都一一列举出来,因为情况太多了,所以只能用try...catch来捕获,如下。

throws与throw

throw用在方法体中,表示抛出一个异常对象。throws用于声明方法可能存在的异常。对于抛出的异常有两种处理方法。第一种是在抛出的地方进行捕获,如果本方法无法处理,不能捕获,那就将这个异常向上抛出,方法后面的throws Exception就表示该方法体内的Exception暂时不处理,需要抛到方法外,让其它方法来捕获和处理,就是甩锅,谁用谁处理,也就是第二种。

finally

无论try所指定的程序块中是否会抛出异常,也无论catch语句是否捕获异常,finally中的代码一定会被执行。finally可以为异常处理提供一个统一的出口,可以对程序的状态作统一的管理。通常在finally语句中进行资源的清除工作,如关闭文件、删除临时文件等。

注意事项

抛出的异常类型必须是throwable的子类。对所有throws都要进行异常处理,如果方法体内部已经进行,方法就不需要标上throws。

catch只能有一个被执行,有可能所有的catch都没有被执行。先catch子类异常,再catch父类异常,否则编译器会报错,如果先捕获父类,子类异常永远不会被捕获。子类继承或重写父类的方法抛出的异常范围不能超过父类异常的范围,方便多态的使用。

异常的优缺点

异常的优点:(1)强制程序员考虑异常的安全性和健壮性。(2)增强程序员对程序的可控性。(3)有利于调试代码。(4)把错误处理从常规代码中分离。

异常的局限:(1)不一定能使程序的逻辑更清晰。(2)异常并不能解决所有问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值