java基础——异常处理

概述

顶级父类:Throwable

1、错误:Error

需要重写代码,工程师无法解决,只能尽量避免,如堆栈溢出错误,好比是绝症。

2、异常:Exception

异常是可以处理的,好比是感冒,工程师可以解决。

  • 分类
  1. 编译时期异常
    编译器会直接把代码标红
  2. 运行时期异常:RuntimeException
    编译器不会直接报出,只有在运行的时候才会被捕捉到

3、创建异常

throw new 异常对象

4、处理异常

在这里插入图片描述

1、throw

抛出异常,将异常抛给调用者不亲自在存在异常的地方进行处理,只要不在线程中可以一直往上抛,直到抛到JVM处,JVM将异常信息打印出来,结束程序。

2、try … catch

  1. try写的是可能出现异常的代码
  2. catch写的是捕获异常,处理异常的逻辑
    异常对象的常用方法:
    String getMessage():获取异常描述信息,原因(提示给用户的时候,就提示错误原因)
    String toString():获取异常的类型和异常描述信息(不用)
    void printStackTrace():打印异常跟踪栈信息并输出到控制台 --> 常用
  • 注意事项:
    a. 抛多少异常,就能捕获多少,或者直接捕获父类异常对象
    b. 多catch的时候,上面不要先捕获父类异常
  • 快捷键 :Ctrl + Alt + T

3、finally

一定会执行的代码,跟随actch使用

两种处理异常的区别

  1. throws:直接向上抛出,自己不做具体处理,抛给调用者(不要一味着向上抛)
  2. try catch finally:不交给JVM了,我们自己处理,一般作为统一处理

总结

  1. 运行时期异常:不用代码处理,证明你写代码有问题,自己去改
  2. 编译时期异常:一般我们直接throws或者try…catch

5、自定义异常

  1. 创建一个类,继承Exception:此自定义异常为编译时期异常
  2. 创建一个类,继承RuntimeException:次异常为运行时异常
  • 注意事项:运行时期异常一般不用管,因为不好发现
/**
 * 自定义异常
 */
public class RegisterException extends Exception {
       public RegisterException() {
    }

    public RegisterException(String message) {
        super(message);
    }
}
/*
模拟注册
1.输一个姓名
2.判断输入的姓名是否在集合中
  2.1 在集合中抛出异常
  2.2 不在集合中,注册成功

 */
public class Test {
    public static void main(String[] args) throws RegisterException {
        String[] arr = {"涛哥","苍老师","热巴","佟丽娅"};
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        register(arr, name);
        System.out.println("注册成功");
    }

    private static void register(String[] arr, String name) throws RegisterException {
        for (int i=0;i<arr.length;i++) {
            if(name.equals(arr[i])){
                throw new RegisterException("用户已经存在");
            }
        }
    }
}

JDK7新特性

try(定义流对象){
	可能出现异常的逻辑代码
}catch(){
	捕获异常
}

这样的话,不用现在try…catch代码块之外定义变量,可以使得编码更加简洁和优雅一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章