异常概念&异常体系

异常

指的是程序在执行过程中,出现的非正常的情况,最终会导致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);
    };

}

おすすめ

転載: blog.csdn.net/nanyangnongye/article/details/120494857