Java异常+解析异常

java.Lang.Throwable**:类是Java语言中所有错误或异常的超类。

Exception:编译期异常,进行编译(写代码)Java程序出现的问题

RuntimeException:运行期异常,Java程序运行过程中出现的问题

Error:错误

异常:可以把异常处理掉,程序可以继续执行。

错误:必修修改源代码,程序才能继续执行。

解析异常

throw关键字

作用:

​ 可以使用throw关键字在指定的方法中抛出异常

使用格式:

  1. throw关键字必须写在方法的内部

  2. throw关键字后边new的对象必须是Exception或者Expception的子类对象

  3. throw关键字抛出指定的异常对象,我们就必须处理这个异常对象

    ​ throw关键字后边创建的是RuntimeExcepton或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常,中断程序)

    ​ throw关键字后边创建的是编译异常(写代码的错误),我们就必须处理这个异常,要么throws,要么try...catch

    throw关键字

 public static void main(String[] args) {
        //int[] arr = null;
        int[] arr = new int[3];
        int e = a(arr, 3); // 3 以超出范围
        System.out.println(e);
//
        /*
        * 工作中首先对对方传递过来的参数进行合法校验
        * 如果参数不合法,我们就必须要抛出异常,告知方法的调用者,传递的参数有问题*/
        //注意:NullPointerException (空指针异常)为运行期异常,我们不用处理,默认交给JVM
    }

    public static int  a(int arr[], int index){
        /*
        * 也可以对index参数进行校验
        * 如果参数不在数组的范围内 可以告诉方法的调用者越界了
        * 注意:ArrayIndexOutOfBoundsException 为运行期异常,我们不用处理,默认交给JVM*/

        if (index<0 || index>arr.length-1){
            throw new ArrayIndexOutOfBoundsException("");
        }

        /*
        * 可以对传递过来的参数数组,进行合法校验
        * 如果数组arr的值是null
        * 那么我们就抛出异常,告知方法的调用者“传递的数组为空”
        * */

        if (arr==null){
            throw new NullPointerException("传递的数组为空");
        }

        int ele = arr[index];
        return ele;


    }

注意:

  1. throw关键字后边创建的是编译异常(写代码的时候),我们就必须处理这个异常,要么throws,要么try...catch

  2. 调用了一个声明抛出异常的方法,我们就必须得处理声明的异常

    ​ 要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM

    ​ 要么try...catch自己处理异常
    缺陷:throws异常后 不会进行后续代码 会直接中断。

try...catch:异常处理的第二种方式,自己处理异常

格式:

try{

​ 可能产生异常的代码

}catch(定义一个异常的变量,用来接收try中抛出的异常对象){

​ 异常的处理逻辑,异常对象之后,怎么处理异常对象

​ 一般在工作中,会把异常的信息记录到一个日志中

}

...

catch(异常类名 变量名){

}

注意:
一个try多个catch注意事项:

catch里边定义的异常变量,如果有子父关系,那么子类的异常变量必须写在上边,否则会报错。

  1. try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
  2. 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码
  3. 如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try...catch之后的代码
public static void main(String[] args) {
        try{
                readFile("D:Ware");
        } catch (IOException e) {
            e.printStackTrace();//会报红字 并打印throw new IOException("文件名的后缀名不对");
            // e.printStackTrace();在命令行打印异常信息在程序中出错的位置及原因。
            System.out.println("后缀名不对"); 
        }
        System.out.println("继续执行");

    }
    public static void readFile(String fileName) throws IOException{
        if (!fileName.endsWith(".txt")){
            throw new IOException("文件名的后缀名不对");
        }
        System.out.println("路径没有问题,读取文件");
    }
}

finally

无论是否出现异常都会执行

注意:

  1. finally不能单独使用,必须和try一起使用
  2. finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要资源释放(IO)

注意:如果finally有return语句,永远返回finally中的结果,避免该情况。

自定义异常类

​ java提供的异常类,不够我们使用,需要自己定义一些异常类

格式:

​ public class XXXException extends Exception | RuntimeException{

​ 添加一个空参数的构造方法

​ 添加一个带异常信息的构造方法

}

注意:

  1. 自定义异常一般都是以Exception结尾,说明该类是一个异常类
  2. 自定义异常类,必须得继承Exception或者RuntimeException

自定义异常__注册练习

public class demo06_02 {
    //1.使用数组保存已经注册过的用户民(数据库)
    static String[] usernames = {"张三","李四","王五"};

    public static void main(String[] args) throws Exception {
    //2.使用Scanner获取用户输入的注册的用户名(前端,页面)
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入注册用户名");
        String username = scanner.next();
        checkUsername(username);
    }

    //3.定义一个方法,对用户输入的用户名进行判断
    public static void checkUsername(String username) throws Exception {
        //遍历注册过的用户名,获取每一个用户名
        for (String name : usernames) {
            //使用获取到的用户名和用户输入的用户名比较
            if (name.equals(username)){
                //结果为true 抛出异常 告知用户已被注册
                throw new Exception("该用户已被注册");
            }
        }
        System.out.println("注册成功");
    }
}
posted @ 2021-09-15 21:48  下次还没有  阅读(85)  评论(0)    收藏  举报