java中的异常分为两类(class):Error类及子类和Exception类及子类,Error表示严重的错误,即使捕获也无法处理,比如OutOfMemoryError内存耗尽。而Exception则是运行时的错误,可以被捕获并处理。
而Exception也分为两种:RuntimeException类及子类(也称之为Unchecked exception)和非RuntimeException类及子类(也称之为Checked Exception)。只有后者需要调用方强制捕获处理或者继续上抛,否则将会在编译时报错,而对于前者运行时异常一般不需要我们手工捕获处理,我们经常遇到的运行时报错的都是属于此类。
参考:java中的Checked Exception和Unchecked Exception的区别
Java异常:选择Checked Exception还是Unchecked Exception?
# 一般用法// 这里的异常捕获是必须的,因为toGBK()中调用的getBytes()是如此声明的:// public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {// ...}// 所以getbytes()的调用者要么自己捕获并处理该异常,要么也和它一样,继续throws xxx,将该异常的处理// 层层上传,直到在main函数中处理。// 如果调用的方法并未明确声明抛出某种异常,那么当前方法可以不主动捕获处理,而是交由上层方法进行捕获// 处理。当异常发生时将会层层传递直到被上层调用者捕获处理。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(); // 尝试使用用默认编码}}}# 进阶用例// 如果多个catch的异常之间存在继承关系,则子类异常的捕获一定要放在父类前,否则子类异常永远无法被捕获。// 不存在继承关系都处理方式相同的异常可以一同处理。// printStackTrace()可以打印出方法的调用栈。public static void main(String[] args) {try {process1();process2();process3();} catch (IOException | NumberFormatException e) {e.printStackTrace();} catch (Exception e) {System.out.println("IO error");} finally {System.out.println("END");}}
