java基础-JAVA的异常体系

Java的异常是class,它的继承关系如下:

image-20200314133413440

Throwable是异常体系的根,它继承自ObjectThrowable有两个体系:ErrorExceptionError表示严重的错误,程序对此一般无能为力

image-20200314134027978

Java标准库定义的常用异常包括:

Exception
│
├─ RuntimeException		(不需要捕获)
│  │
│  ├─ NullPointerException
│  │
│  ├─ IndexOutOfBoundsException
│  │
│  ├─ SecurityException
│  │
│  └─ IllegalArgumentException
│     │
│     └─ NumberFormatException
│
├─ IOException
│  │
│  ├─ UnsupportedCharsetException
│  │
│  ├─ FileNotFoundException
│  │
│  └─ SocketException
│
├─ ParseException
│
├─ GeneralSecurityException
│
├─ SQLException
│
└─ TimeoutException

捕获异常

捕获异常使用try...catch语句,把可能发生异常的代码放到try {...}中,然后使用catch捕获对应的Exception及其子类:

在方法定义的时候,使用throws Xxx表示该方法可能抛出的异常类型。调用方在调用的时候,必须强制捕获这些异常,否则编译器会报错。

比如

String.getBytes(String)方法定义是:

public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {
    ...
}

定义了可能的 UnsupportedEncodingException异常,因此在使用 字符串对应的 .getBytes()方法时候,就必须要捕获可能出现的异常

捕获异常的方式可以在:

  • 在使用了可能抛出异常的方法或者函数 的 函数内部,如 在 toGBK()函数里面使用到了 s.getBytes()方法
    使用 try catch语句,捕获对应的Exception及其子类

    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            byte[] bs = toGBK("中文");
            System.out.println(Arrays.toString(bs));
        }
    
        static byte[] toGBK(String s) {
            try {
                // 用指定编码转换String为byte[]:
                return s.getBytes("GBK");
            } catch (UnsupportedEncodingException e) {
                // 如果系统不支持GBK编码,会捕获到UnsupportedEncodingException:
                System.out.println(e); // 打印异常信息
                return s.getBytes(); // 尝试使用用默认编码
            }
        }
    }
    
  • 在声明函数的时候,使用 throws Xyz语句声明可能抛出的异常
    再在调用这个函数的时候,使用 try catch 语句

    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            try {
                byte[] bs = toGBK("中文");
                System.out.println(Arrays.toString(bs));
            } catch (UnsupportedEncodingException e) {
                System.out.println(e);
            }
        }
    
        static byte[] toGBK(String s) throws UnsupportedEncodingException {
            // 用指定编码转换String为byte[]:
            return s.getBytes("GBK");
        }
    }
    
    

可见,只要是方法声明的Checked Exception,不在调用层捕获,也必须在更高的调用层捕获。所有未捕获的异常,最终也必须在main()方法中捕获,不会出现漏写try的情况。

posted @ 2020-07-08 15:31  唐啊唐囧囧  阅读(219)  评论(0编辑  收藏  举报