异常(exception、try-catch)、泛型
1.Exception 和 Error 有什么区别?
在 Java 中,所有的异常都有一个共同的祖先 java.lang
包中的 Throwable
类。Throwable
类有两个重要的子类:
Exception
:程序本身可以处理的异常,可以通过catch
来进行捕获。Exception
又可以分为 Checked Exception (受检查异常,必须处理) 和 Unchecked Exception (不受检查异常,可以不处理)。Error
:Error
属于程序无法处理的错误 ,不建议通过catch
捕获 。例如 Java 虚拟机运行错误(Virtual MachineError
)、虚拟机内存不够错误(OutOfMemoryError
)、类定义错误(NoClassDefFoundError
)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
2.try-catch-finally
finally 中的代码一定会执行吗?
不一定!在某些情况下,finally 中的代码不会被执行。
(1) finally 之前虚拟机被终止运行
(2) 程序所在的线程死亡
(3) 关闭 CPU
比如在catch里写了 //终止当前正在运行的Java虚拟机 System.exit(1)
3.如何使用 try-with-resources
代替try-catch-finally
?
适用范围(资源的定义): 任何实现 java.lang.AutoCloseable
或者 java.io.Closeable
的对象
关闭资源和 finally 块的执行顺序: 在 try-with-resources
语句中,任何 catch 或 finally 块在声明的资源关闭后运行
try (Scanner scanner = new Scanner(new File("test.txt"))) { while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); }
4.泛型
泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
//在实例化泛型类时,必须指定T的具体类型 public class Generic<T>{ private T key; public Generic(T key) { this.key = key; } public T getKey(){ return key; } } public interface Generator<T> { public T method(); } public static <E> void printArray( E[] inputArray ) { for ( E element : inputArray ){ System.out.printf( "%s ", element ); } System.out.println(); }
项目中哪里用到了泛型?
- 自定义接口通用返回结果
CommonResult<T>
通过参数T
可根据具体的返回类型动态指定结果的数据类型 - 定义
Excel
处理类ExcelUtil<T>
用于动态指定Excel
导出的数据类型 - 构建集合工具类(参考
Collections
中的sort
,binarySearch
方法)。
throw和throws的区别:
一、语法位置不同。throw用于函数内部,后面跟的是异常对象,而throws用于函数结尾,后面跟的是异常类,后面可以跟多个不同的异常类,表示抛出不同的异常
二、关键字功能不同。throw用于抛出异常,并将问题立即抛出给上一级的调用者,
并且当throw执行到时,后面的其他语句不会执行。而throws只是用于声明异常,让调用者知道这里可能会出现问题,并提前处理异常发生情况,属于一种提前通知。
同时,他们两个也有相同点。
那就是都是被动的方式(不主动处理)来处理异常,只是抛出异常,真正处理异常的往往是由调用他们的上层函数去捕获处理。