0
点赞
收藏
分享

微信扫一扫

JavaSE基础-异常处理

海牙秋天 2022-04-21 阅读 89
java
1.try catch语句
基本语法
public void tryTest() {
    int[] arr = new int[1];
    try {
        arr[1] = 10;
    } catch (Exception ex) {
        arr[0] = 0;
        ex.printStackTrace()
    }
}
2.异常分类
异常类图

在这里插入图片描述

特性
  • 派生于Error或者RuntimeException的异常称为unchecked exception,语法不要求一定要使用try catch语句或者throws语句处理异常

  • 所有其他的异常成为checked exception,语法要求必须要使用try catch语句或者 throws语句处理的异常

3.throws关键字

定义一个方法的时候可以使用throws关键字声明。使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理

public void myMethod1() throws Exception {
    throw new Exception();				// 必须抛出异常给调用处
}
public void myMethod2() {
    throw new RuntimeException();		// 不必须抛出异常给调用处
}
throw关键字

异常的抛出需要使用throw关键字,抛出的是一个异常对象,一般我们采用下面的方式进行抛出

throw new NullPointerException();
特点
  • 可以使用throws关键字,抛出一个异常。可以抛出多种类型的异常,用逗号分开就可以。
  • 抛出的异常类型,可以是实际异常的父类或者本身
接口中使用throws语句
  • 接口中声明了抛出异常,实现类中可以抛,也可以不抛。抛的话必须是接口声明的类或其子类
  • 接口中没有声明抛出异常,实现类中可以抛RuntimeException,也可以不抛。如果抛 checked exception,就会出错。可以选择catch住 checked exception,然后将它封在RuntimeException里
4.异常的传递

方法调用栈:方法一个调用一个的层层调用

Java异常的传递:沿着方法调用栈顺序一直抛,最终要么被catch住,要么当前线程出错退出

5.自定义异常
  • 继承异常类即可实现自定义异常
  • 异常最重要的信息:类型、错误信息和出错时的调用栈
public class MyException extends RuntimeException {
    private String code;

    public MyException(String message) {
        super(message);
        this.code = message;
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
        this.code = message;
        System.out.println(cause.toString());
    }

    public String getCode() {
        return code;
    }
}
6.try catch finally语句
  • 无论是代码正常执行还是出错,finally一定会执行(可以认为finally语句会在方法返回后,后面的方法开始前,会在return语句后)
  • finally里给return用的变量值赋值没用
try finally 语句

只捕捉错误以及退出操作,不做错误处理

多个catch
public class CatchMultiException {

    private static void catchMultiOld() {
        try {
            throwMultiException(0);
            // 如果一个方法抛出多种异常,可以针对多个类型有多种catch语语句
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void catchMultiTypeMultiMatch() {
        try {
            throwMultiException(0);
            // catch的类型不能有多种匹配可能,否则会出错
        }
//        catch (Exception e) {
//            e.printStackTrace();
//        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {

        }
    }

    private static void catchMultiNew() {
        try {
            throwMultiException(0);
            // 如果捕获了不同类型的异常,但是处理方式一样,可以用简化模式
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }
    }

}
自动回收资源的try语句

实现了AutoCloseable接口的类表示可以自动回收

public class MyAutoClosableResource implements AutoCloseable {

    private String resName;
    private int counter;

    public MyAutoClosableResource(String resName) {
        this.resName = resName;
    }

    public String read() throws IOException {
        counter++;
        if (Math.random() > 0.1) {
            return "You got lucky to read from " + resName + " for " + counter";
        } else {
            throw new IOException("resource不存在哦");
        }
    }

    @Override
    public void close() throws Exception {
        System.out.println("资源释放了:" + resName);
    }
}

使用自动回收资源的try语句,try后面添加了一个(),()创建了实现AutoCloseable接口的类的实例

public class TryWithResource {
    public static void main(String[] args) {
        try (
             MyAutoClosableResource res1 = new MyAutoClosableResource("res1");
             MyAutoClosableResource res2 = new MyAutoClosableResource("res2")
        ) {
            while (true) {
                System.out.println(res1.read());
                System.out.println(res2.read());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
举报

相关推荐

0 条评论