异常
1.异常指不期而遇的各种问题,通常是Throwtable的子类,所以JAVA中的异常都是对象,描述了一段编码中的错误条件。
2.而throwtable有两个重要的子类:Exception(异常)和Error(错误);其中Error不是程序可以处理的,而是jvm本身出现的错误,如:内存资源不足时将出现OutOfMemoryError;而Exception是程序可以处理的。
3.异常又可以分为可查询异常与不可查询异常;Exception除了运行时异常以外的其它子类异常都属于可查询异常,这类异常要么补获要么抛出,否则编译不会通过;而运行时异常和Error则为不可查询异常,其中的运行时异常由于编译器不会检查它,所以即使不补获或者抛出,编译也是可以通过的,但在逻辑上应该尽量避免,因为在运行时依旧会被系统抛出。
这里主要说的便是捕获异常,抛出异常以及自定义异常:
一、捕获异常:
格式:try{
需要捕获异常的代码块
}catch(异常的种类名 异常自定义名){
处理异常的方式(有对应的异常时进入)
}finally{
无论是否有异常都会执行的部分
}
1.try部分,只要发生异常,那么剩下的代码将不会执行,而是直接进入catch部分;
2.一个try块可以有多个catch块分别来处理遇到的不同的异常,但通常在发生异常的情况下只会执行其中一个对应的catch;
3.finally部分可以省略不写。
三、抛出异常:
格式:
方法名+throws+要抛出的异常名,要抛出的异常名...,要抛出的异常名(异常列表)
当方法抛出异常时,对于抛出的异常及其子异常,该方法将不做处理,而是交给调用该方法的方法处理,当调用方法无力处理时,应该继续抛出。
四、自定义异常:
自定义异常的表面原理可以说就是构造方法;在这里就不多说,直接用代码解释:
package com.test;
public class Main {
public static void main(String[] args) {
try {
int i=1/0;
} catch (NullPointerException e) {
System.out.println("空指针异常");
}catch (ArithmeticException e) {//捕获异常
throw new MyException("除数不能为0啊啊啊啊啊");//抛出异常
}
}
}
package com.test;
public class MyException extends RuntimeException{
/**
*
*/
private static final long serialVersionUID = 1L;
public MyException(String str){//带String参数的构造方法
super(str);//调用RuntimeException类的对应的构造方法
}
}
最后运行下来的结果:
Exception in thread "main" com.test.MyException: 除数不能为0啊啊啊啊啊
at com.test.Main.main(Main.java:23)