异常
在JAVA的学习中,相信大家都会遇到很多错误,相信绝大多说人也跟我刚学的时候一样,看到报错或程序崩溃就会很随之崩溃,所谓不知道的东西都是最可怕的,今天这篇博客就是让大家了解报错,知己知彼,克服恐惧.
1:异常的体系概述
知己知彼,百战不殆,第一步就先让我们了解一下异常的体系,话说在JAVA中万物皆对象,没有错,报错也是如此,你可以把他想成一棵树,树的树根与树干是一个叫做Throwable的对象,是程序中所有问题的父类,而这棵树有两个分支,一个分支是异常(Exception)可针对性处理如越界等异常,与错误(Error)一般不针对性处理,然后就是有上述两个分支的子类组成一颗完整的对象–树,并且他们的子类都有Error与Exception作为后缀.
2:异常的处理
知道了他们的原理后,我们就要处理异常了,一般我们用try与catch来处理异常;
try{
需要被检测的代码(可能会引发异常)
}catch(异常的类名 变量名){
对异常代码的处理
}
执行流程:先假设try中代码中没有异常,执行完try结构中的代码后就会结束整个结构.如果try中代码存在异常,catch就会捕获异常,执行catch中处理异常的代码,如果没有捕获到异常,程序就会终止运行,打印异常信息.
getMessage() 获取异常信息,获取默认处理异常中冒号后面的部分.
toString() 获取异常的特定信息,获取异常详细的类名一会异常的信息.
3:Throws
当代码运行异常并且在它所对应的catch不想解决时,可以将他的异常抛出,主要在函数上声明可能引发的异常,需要用throws关键字进行标识,其结构一般是访问修饰符,返回值类型,方法名(参数列表) throws 异常类名1,异常类名2…{}
4:异常的处理原则
无论是否抛出异常,都需要将异常解决.那么在解决时就需要注意一下几点,
1:在函数声明异常时,应该声明更具体的异常,这样调用者可以根据生明的异常进行针对处理.
2:当函数存在多个异常时,函数声明需要通过throws声明多个异常,通过逗号隔开;
3:处理原则是:抛什么处理什么,抛几个处理几个,不写多余处理,具有针对性
5:异常的分类:
1:受检异常(编译时被检测的异常):Exceotion及其子类(不包括RunTimeException及其子类)
特点:编译器会对异常进行检查,如果没有对异常抛出或者throws的情况下,代码会报错.
2:非受检异常(编译时不被检测的异常):RunTimeException及其子类
特点:编译器不会对RunTimeException及其子类检测.一般函数声明时如果存在异常可以针对性声明,对于运行时错误来说,目的是让代码停止运行,方便程序员修正代码.
一般在实际开发中,需要处理异常一般都是属于受检异常.
6:自定义异常
在实际开发过程中,有一些问题是根据项目的实际需求进行制定,在JAVA体系中并没有响应的描述,这是就需要自定义异常了.
我们需要声明一个类继承Exception或者其子类.
//1.定义一个类继承Exception或者其子类
class FuShuException extends Exception{
public FuShuException(String message){
super(message);
}
}
//2.需要使用该自定义异常的地方通过throw关键字封装抛出异常
class Demo5{
public int div(int num1,int num2) throws FuShuException{
if(num2<0){
//手动封装抛出自定义异常
throw new FuShuException("除数为负数了!!");
}
return num1/num2;
}
}
public class ExceptionDemo4 {
public static void main(String[] args) {
Demo5 demo=new Demo5();
try {
int result=demo.div(4, -2);
System.out.println(result);
} catch (FuShuException e) {
System.out.println(e.getMessage());
}
System.out.println("over");
}
}
上述就是自定了一个算数运算中除数为负数则视为异常就会报错的代码.
最后我们介绍一下finally过关键字,他是写在trycatch方法上的,起作用一般用来在IO流读写时,来关闭文件.
try{
需要被检测的代码(可能引发异常的代码)
}catch(异常的类名 变量名){
对异常进行处理的代码
}finally{列表内容
一定要执行的代码
}