JAVA中的异常处理机制与异常处理类、多异常处理

异常

程序在运行时,产生的错误。

程序错误的分类

  1. 语法错:违反了设计语言的语法规则而产生的错。如:括号不匹配、标识符未声明、语句少分号等。(这些错误是在编译时,就能被发现的,所有也叫编译错误。)
  2. 语义错:如:除数为0错,给变量的赋值超过了允许范围,输入的数据格式错误,数组下标越界。(这类错误程序在编译时是无法检测到的,又称运行错)
  3. 逻辑错:由于程序无法实现由于程序员设计想法和功能时而产生的错误,即运行结果与预期结果不符合。如:循环时候,循环条件不正确、循坏次数不正确等导致的结果不正确。

异常针对的是运行错

像:除数为0,操作数超出数据范围、文件找不到、网络连接中断

异常处理机制

java程序的异常处理机制,是面向对象的,所以Java语言中所有异常都是以类的形式存在的。

Java语言的异常处理机制就是使得程序自身能够去捕获和处理异常,由已经写好的异常处理程序来调整程序的运行方向,而不至于使得程序无法运行。如果没有合适的异常处理程序来处理异常,运行就会终止。

理解异常处理的一个过程:

发生异常的代码可以抛出异常,运行系统捕获异常,并交由程序员已经编写好的异常处理代码进行处理。

异常处理类

异常类最上层是一个单独的类Throwable类,是Java.lang包下的。
该类派生出了两个子类,java.lang.Error和java.lang.Exception。

Error子类由系统保留,该类是定义了一些应用程序无法捕捉到的错误。这里就暂时不过多思考了。。。。因为程序不对这类错误进行直接处理,而是操作系统处理。。

Exception子类是用户程序能够捕捉到的异常情况。和其他的类一样,有两个构造方法:

public Exception();

接收字符串参数传入的信息,通常是对该异常所对应错误的描述:
public Exception(String s);

Exception类从父类(Throwable)那继承了若干方法,常用的是:

返回描述当前Exception类信息的字符串:
public String toString();

用于输出当前异常对象先后调用执行了哪些对象或类的方法:
public void printStackTrace();

异常类
运行时异常(如图包含的)这类运行时异常可以不编写异常处理代码,依然可以编译成功,因为他们只有在运行时,才可能产生错误。(这类运行时异常,程序应该避免发生而可以不去使用try-catch-finally语句捕获)

非运行时异常,是程序运行过程中有环境原因造成的异常,如:输入输出异常、网络地址不能打开、文件未找到等,这类程序必须在程序中使用try-catch-finally语句去捕获并进行相应的处理,否则编译就不能通过了。

try-catch-finally语句,语法格式:
在这里插入图片描述
try块中可能发生一个或多个异常,若发生异常则程序中断,抛出异常类所产生的对象。

try语句时启动java异常处理机制的,try块中某条语句执行时一旦出现异常,这时候被启动的异常处理机制就会自动捕获到它,然后就程序就不执行异常语句后面所有未执行的语句,而去执行catch语句,判断catch语句中写的异常类名是否为匹配的异常类,如果抛出的异常对象是catch捕获的异常对象,就会进入到catch块中继续执行。

finally块:无论try块,是否捕获到异常,或者捕获到的异常是否与catch块中的异常相同,一定的会执行的程序代码。
在finally块结束后,就会执行try-catch-finally块后的代码继续执行。

多异常处理

多异常处理是在一个try块后面定义若干个catch块来实现的。每个catch块用来接收和出一种特定的异常对象。

流程:
try抛出异常,程序就会转向第一个catch块,并判断当前的异常对象是否可以被这个catch块接收,就是是否与catch块中后面括号内的参数类型是否匹配(要不就是完全一致,要不就是所抛出的异常对象的祖先类)如果第一个catch就一致,则程序将直接执行该catch,try块中尚未执行的语句和其他的catch块就都不执行了。如果第一个catch块不一致,自动跳转到第二个,然后是以此类推。
如果都不行,程序流程将返回到调用该方法的上层方法中是否有所匹配的catch块,如果没有将继续往上追溯,如果还是没有程序将终止。

需要注意的是因为异常对象与catch块中对象的比对是有先后顺序的,所有在写程序代码catch块中的内容时,需要注意设计好顺序。一般把比较具体、常见的异常放前面,把可以与多种异常类型相匹配的放在较后的位置。
注:将子类异常的catch语句放父类后面,编译是不能通过的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值