文章目录
前言
才疏学浅,能力有限,如有错误,欢迎评论指出,一起进步~
一、异常的概述
1、异常的概念
在Java语言中,将程序执行中发生的不正常的情况称为“异常”。
注意:语法错误和逻辑错误不是异常。
2、异常事件的分类:
- error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误,资源耗尽等严重情况。
- Exception:其他因编程错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码处理。例如:空指针访问,试图读取不存在的文件,网络连接中断,数组角标越界。
二、异常的体系结构
三、常见的异常
常见的运行期异常:
- ArithmeticException:算数异常
- ClassCastException:类型转换异常
- IndexOutOfBoundsException:下标越界异常
- NullPointerException:空指针异常
- NumberFormatException:数字格式化异常
常见的编译期异常:
- EOFException:输入过程中意外地到达文件结束或流结束。
- FileNotFoundException:指示尝试打开由指定路径名表示的文件失败。
四、异常的处理
1、异常的处理机制
- 将异常处理的程序代码集中到一起,与正常的程序代码分开,使得程序简洁,易于维护。
- Java提供的异常处理是抓抛模型。
- 如果出现异常,会生成一个异常类对象,该异常对象将被提交给Java运行时的系统,这个过程称为抛出异常。一旦抛出异常对象后,后续代码将不会执行。
- 异常对象的产生:系统自动生成异常对象;手动生成异常对象,并抛出(throw)
2、异常处理的方式
1.try-catch-finally
使用格式:
try {
//可能发生异常的代码
}catch (异常类型1 变量名1){
//处理方式1
}catch (异常类型2 变量名2){
//处理方式2
}catch (异常类型3 变量名3){
//处理方式3
}finally {
//一定执行的代码
}
注意:
- finally是可选的。
- 使用try将可能出现异常的代码包起来,程序执行中,一旦出现异常,就会生成异常对象,根据此对象的类型,去catch中匹配。
- 一旦try中的异常匹配到catch时,就进入catch中的处理代码,一旦处理结束,跳出该try-catch结构(没有finally的情况下)。继续执行后续代码。
- 如果catch中的异常类型有父子关系,则子类在上,父类在下。
- 常见的异常处理方式:String getMessage();printStackTrace()
- try代码块中定义的变量不能在代码块外面访问。
- finally代码块中的代码是一定会执行的(当然,也有例外,比如虚拟机异常结束)。即使catch中又出现了异常,try中有return语句,catch中有return语句等。
- 像数据库的连接,输入输出流网络编程Socket等资源,JVM不能自动回收,需要手动回收。此时,资源的释放,就需要写在finally中。
2.throws + 异常类型
- 此方式写在方法的声明处。表示执行此方法时,可能会抛出异常。并且将该类型的异常抛给方法的使用者。并没有真正处理掉。
- try-catch-finally:真正的将异常处理掉了。
- 在main方法上抛出异常,实际上就是将异常交给虚拟机处理了。
五、手动抛出异常
通过throw关键字手动抛出异常对象。代码实例:
public int confirm(int x) throws Exception {
if(x > 0){
return x;
}else {
throw new Exception();
}
}
五、自定义异常类
步骤:
- 继承现有的异常类:RuntimeException、Exception
- 提供全局常量:serialVersionUID(相当于唯一标识了该类)
代码实例:
public class ExceptionDemo02 extends Exception{
static final long serialVersionUID = -70923894332459l;
public ExceptionDemo02() {
}
public ExceptionDemo02(String message){
super(message);
}
}
public class Main {
public static void main(String[] args) throws ExceptionDemo02 {
int x = 33;
if(x > 30){
throw new ExceptionDemo02("该数字大于30");
}
}
}
运行结果: