java中的异常分为两类(class):Error类及子类和Exception类及子类,Error表示严重的错误,即使捕获也无法处理,比如OutOfMemoryError内存耗尽。而Exception则是运行时的错误,可以被捕获并处理。
    而Exception也分为两种:RuntimeException类及子类(也称之为Unchecked exception)和非RuntimeException类及子类(也称之为Checked Exception)。只有后者需要调用方强制捕获处理或者继续上抛,否则将会在编译时报错,而对于前者运行时异常一般不需要我们手工捕获处理,我们经常遇到的运行时报错的都是属于此类。

    参考:java中的Checked Exception和Unchecked Exception的区别
    Java异常:选择Checked Exception还是Unchecked Exception?

    1. # 一般用法
    2. // 这里的异常捕获是必须的,因为toGBK()中调用的getBytes()是如此声明的:
    3. // public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {
    4. // ...}
    5. // 所以getbytes()的调用者要么自己捕获并处理该异常,要么也和它一样,继续throws xxx,将该异常的处理
    6. // 层层上传,直到在main函数中处理。
    7. // 如果调用的方法并未明确声明抛出某种异常,那么当前方法可以不主动捕获处理,而是交由上层方法进行捕获
    8. // 处理。当异常发生时将会层层传递直到被上层调用者捕获处理。
    9. import java.io.UnsupportedEncodingException;
    10. import java.util.Arrays;
    11. public class Main {
    12. public static void main(String[] args) {
    13. byte[] bs = toGBK("中文");
    14. System.out.println(Arrays.toString(bs));
    15. }
    16. static byte[] toGBK(String s) {
    17. try {
    18. // 用指定编码转换String为byte[]:
    19. return s.getBytes("GBK");
    20. } catch (UnsupportedEncodingException e) {
    21. // 如果系统不支持GBK编码,会捕获到UnsupportedEncodingException:
    22. System.out.println(e); // 打印异常信息
    23. return s.getBytes(); // 尝试使用用默认编码
    24. }
    25. }
    26. }
    27. # 进阶用例
    28. // 如果多个catch的异常之间存在继承关系,则子类异常的捕获一定要放在父类前,否则子类异常永远无法被捕获。
    29. // 不存在继承关系都处理方式相同的异常可以一同处理。
    30. // printStackTrace()可以打印出方法的调用栈。
    31. public static void main(String[] args) {
    32. try {
    33. process1();
    34. process2();
    35. process3();
    36. } catch (IOException | NumberFormatException e) {
    37. e.printStackTrace();
    38. } catch (Exception e) {
    39. System.out.println("IO error");
    40. } finally {
    41. System.out.println("END");
    42. }
    43. }