JAVA学习(异常)
一、异常
指运行时期发生的不正常情况
在JAVA中用类的方式对不正常的情况进行描述和封装对象。
描述不正常情况的类,就称为异常类。
将正常流程代码与问题处理代码分离,提高阅读性。
将问题的共性向上抽取,形成异常体系
最终问题(不正常情况)分为两大类:
Throwable:该体系的特点在于其所有的子类都具有可抛型
throws,throw,凡是被这两个关键字所操作的类和对象都具备可抛型。
1.一般不可处理的。Error
特点:是由于JVM抛出的严重性问题。
这种问题一般不针对处理,直接修改程序。
2.可以处理的。Exception
1.1自定义异常
某些异常在JAVA中并没有定义过,就需要按照JAVA异常的创建思想,面对对象,将该异常进行自定义描述,并封装成对象。
注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛型,才可以被throws,throw两个关键字所操作。
例如:角标为负数的异常情况
public class FuShuIndexException extends Exception{ FuShuIndexException(){ } FuShuIndexException(String msg){ super(msg); //交给Exception类完成抛出信息 } } public class Demo { public int method(int[] arr,int index) throws FuShuIndexException { //对异常进行声明 if(index<0){ throw new FuShuIndexException("角标为负数"); } return arr[index]; } } public class ExceptionDemo { public static void main(String[] args) throws FuShuIndexException{ //对异常进行声明 int []arr = new int[3]; Demo d = new Demo(); int num = d.method(arr,-3); System.out.println(num); } }

1.2 异常的分类:
(1)编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系
希望在编译时就进行检测,让这种问题有对应的处理方式
(2)编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类
这种问题发生时,无法让功能继续,运算无法进行,更多的是因为调用的原因导致的。
throws和throw的区别:
1.throws使用在函数上,throw使用在函数内。
2.throws抛出的是异常类,可以抛出多个,用逗号隔开
throw抛出的是异常对象
1.3 异常捕捉
异常的使用必须要对其进行声明或者捕捉,除了使用throws进行声明外,还可以通过捕捉异常进行使用
具体格式是:
try{
//需要被检测异常的代码
}
catch(异常类 变量){ //该变量用于接收发生的异常对象 (可以使用多catch)
//处理异常的代码
}
finally{
//一定会被执行的代码
}
多catch将父类的catch放在最下面
多catch时将 catch(Exception e){ } 放在最后面
例如:角标为负数的异常情况
public class FuShuIndexException extends Exception{ FuShuIndexException(){ } FuShuIndexException(String msg){ super(msg); //交给Exception类完成抛出信息 } } public class Demo { public int method(int[] arr,int index) throws FuShuIndexException { //无法处理的情况使用抛出 ,对异常进行声明 if(index<0){ throw new FuShuIndexException("角标为负数"); } return arr[index]; } } public class ExceptionDemo { public static void main(String[] args) throws FuShuIndexException{ int []arr = new int[3]; Demo d = new Demo(); try{ //可以处理的情况使用捕捉异常 int num = d.method(arr,-3); System.out.println(num); } catch (FuShuIndexException e){ System.out.println("角标为负数"); } } }
异常捕捉后程序继续执行,执行对异常的处理:

1.4 finally代码块
finally为一定会执行的代码,产生异常或者没有异常都会执行。
1.5异常的注意事项
(1)子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者改异常的子类。
(2)如果父类抛出多个异常,那么子类只能抛出父类异常的子集
注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛出异常。只能捕捉。

浙公网安备 33010602011771号