Java 语言基础
异常处理
Error 和 Exception
Exception 和 Error, ⼆者都是 Java 异常处理的重要⼦类, 各⾃都包含⼤量⼦类。均继承自 Throwable 类。Error 表⽰系统级的错误, 是 java 运⾏环境内部错误或硬件问题, 不能指望程序来处理这样的问题, 除了退出运⾏外别⽆选择, 它是 Java 虚拟机抛出的。Exception 表⽰程序需要捕捉、 需要处理的异常, 是由与程序设计的不完善⽽出现的问题, 程序必须处理的问题
异常类型
Java 中的异常, 主要可以分为两⼤类, 即受检异常( checked exception) 和非受检异常( unchecked exception) 。
受检异常
对于受检异常来说, 如果⼀个⽅法在声明的过程中证明了其要有受检异常抛出:public void test() throw new Exception
非受检异常
对于⾮受检异常来说, ⼀般是运⾏时异常, 继承⾃RuntimeException。在编写代码的时候, 不需要显⽰的捕获, 但是如果不捕获, 在运⾏期如果发⽣异常就会中断程序的执行。
这种异常⼀般可以理解为是代码原因导致的。⽐如发⽣空指针、 数组越界等。所以,只要代码写的没问题, 这些异常都是可以避免的。也就不需要我们显⽰的进⾏处理。
异常相关关键字
throws、 throw、 try、 catch、 finally;try⽤来指定⼀块预防所有异常的程序;catch⼦句紧跟在 try 块后⾯, ⽤来指定你想要捕获的异常的类型;finally 为确保⼀段代码不管发⽣什么异常状况都要被执⾏;throw 语句⽤来明确地抛出⼀个异常;throws⽤来声明⼀个⽅法可能抛出的各种异常
自定义异常
⾃定义异常就是开发人员⾃⼰定义的异常, ⼀般通过继承 Exception 的⼦类的⽅式实现
异常链
“ 异常链” 是 Java 中⾮常流⾏的异常处理概念, 是指在进⾏⼀个异常处理时抛出了另外⼀个异常, 由此产⽣了⼀个异常链条。
try {} catch (IOException e) {throw new SampleException("Other IOException", e);} 在此示例中, 当捕获到 IOException 时, 将创建一个新的 SampleException 异常,并附加原始的异常原因, 并将异常链抛出到下一个更高级别的异常处理程序
finally 和 return 的执行顺序
如果 try 中有 return 语句, 那么 finally 中的代码还是会执行。因为 return 表⽰的是要整个方法体返回, 所以, finally 中的语句会在 return 之前执⾏。
但是 return 前执行的 finally 块内, 对数据的修改效果对于引用类型和值类型会不同:
//测试 修改值类型static int f() {int ret = 0;try {return ret; // 返回 0, finally 内的修改效果不起作用} finally {ret++;System.out.println("finally 执行");}}// 测试 修改引用类型static int[] f2(){int[] ret = new int[]{0};try {return ret; // 返回 [1], finally 内的修改效果起了作用} finally {ret[0]++;System.out.println("finally 执行");}}