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 执行");}}