异常
指的是程序在执行过程中,出现的非正常的情况,最终会导致jvm的非正常停止
在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象,Java处理异常的方式是中断处理
异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行。
异常体系
异常分类
一种是运行期异常 运行期异常 我们无需处理
一种是捕捉异常 thow关键字我们可以在指定的方法里面抛出指定的异常
Java处理异常的五个关键字:try-catch、finally、throw、throws
Objects非空判断_requireNonNul
package cn.itcast.day12.demo04;
import java.util.Objects;
/**
* @author admin
* @version 1.0.0
* @ClassName Demo02.java
* @Description TODO
* @createTime 2021年09月26日 10:41:00
*/
public class Demo02 {
public static void main(String[] args) {
method(null);
}
public static void method(Object obj){
//对传递过来的参数进行一个合法性的校验
/* if (obj == null){
throw new NullPointerException("传递的对象的值是null");
}*/
/*Objects.requireNonNull(obj);*/ //Exception in thread "main" java.lang.NullPointerException
Objects.requireNonNull(obj,"传递的对象的值是null"); // Exception in thread "main" java.lang.NullPointerException: 传递的对象的值是null
}
}
_throws关键字_异常处理的第一种方式
throws 和 try-catch的区别就是
throws发生异常的时候中断程序后续代码不在执行
而try-catch对异常进行捕获,捕获到Catch里面,后续代码继续执行
Throwable类中3个异常处理的方法
package cn.itcast.day12.demo04;
import java.io.FileNotFoundException;
/**
* @author admin
* @version 1.0.0
* @ClassName Demo03.java
* @Description TODO
* @createTime 2021年09月26日 11:28:00
*/
public class Demo03 {
public static void main(String[] args) {
try {
readfile("c:\\a.tx");
} catch (FileNotFoundException e) {
// System.out.println("e = " + e.getMessage());// 传递的文件路径不是c:\a.txt
// System.out.println(e.toString());// java.io.FileNotFoundException: 传递的文件路径不是c:\a.txt
e.printStackTrace();
/**
* java.io.FileNotFoundException: 传递的文件路径不是c:\a.txt
* at cn.itcast.day12.demo04.Demo03.readfile(Demo03.java:28)
* at cn.itcast.day12.demo04.Demo03.main(Demo03.java:16)
*
*/
}
System.out.println(" 后续代码 ");
}
public static void readfile(String fileName) throws FileNotFoundException {
if (!fileName.equals("c:\\a.txt")){
throw new FileNotFoundException("传递的文件路径不是c:\\a.txt");
}
System.out.println("路径没有问题,继续执行");
}
}
finally代码块
package cn.itcast.day12.demo04;
/**
* @author admin
* @version 1.0.0
* @ClassName DDemo06.java
* @Description TODO
* @createTime 2021年09月26日 12:13:00
*/
/**
* 如果finally有return语句,永远返回return中的结果 避免该情况
*/
public class DDemo06 {
public static void main(String[] args) {
int a = getA();
System.out.println("a = " + a);// a = 200
}
private static int getA() {
int a = 110;
try {
return a;
} catch (Exception e) {
e.printStackTrace();
} finally {
return 200;
}
}
}
子父类异常
package cn.itcast.day12.demo04;
/**
* @author admin
* @version 1.0.0
* @ClassName Demo06.java
* @Description TODO
* @createTime 2021年09月26日 13:40:00
*/
/**
* 子父类的异常
* 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常
* 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常,此时子类产生该异常,只能捕获处理,不能声明抛出
*
*/
public class Fu {
public void show1() throws NullPointerException,ClassCastException{};
public void show2() throws IndexOutOfBoundsException{};
public void show3() throws IndexOutOfBoundsException{};
public void show4() {};
public void show5(){};
class Zi extends Fu{
//子类重写父类方法时,抛出和父类相同的异常
public void show1() throws NullPointerException,ClassCastException{};
//子类重写父类方法时,抛出父类异常的子类
public void show2() throws ArrayIndexOutOfBoundsException{};
//子类重写父类方法时,不抛出异常
public void show3() throws IndexOutOfBoundsException{};
//父类该方法没有抛出异常 子类不能异常
/*public void show4() throws Exception{};*/
//父类该方法没有抛出异常 子类只能捕获处理
public void show5(){
throw new NullPointerException("声明异常");
}
}
}
自定义异常类
package cn.itcast.day12.demo04;
/**
* @author admin
* @version 1.0.0
* @ClassName RegisterException.java
* @Description TODO
* @createTime 2021年09月26日 13:56:00
*/
/**
* 自定义异常类:
* java提供的异常类,不够我们使用,需要自己定义一些异常类
* 格式:
* public class XXXException extends Exception | RuntimeException{
* 添加一个空参数的构造方法
* 添加一个带异常信息的构造方法
* }
* 注意:
* 1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类
* 2.自定义异常类,必须得继承Exception或者RuntimeException
* 继承Exception;那么自定义异常列就是一个编译期异常,如果方法内部抛出了编译器异常,就必须处理这个异常,要么throws 要么try...catch
* 继承RuntimeException;那么自定义异常就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)
*
*/
public class RegisterException extends Exception{
// 添加一个空参数的构造方法
public RegisterException(){
super();
};
// 添加一个带异常信息的构造方法
//查看源码发现 所以的异常类都会有一个带异常信息的构造方法,方法内部会调用父类带异常信息的构造方法,让父类来处理这个异常信息
public RegisterException(String messages){
super(messages);
};
}