在返回错误的时候突发奇想,思考Exception和Error的区别
Throwable:
它有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Error(错误:它包括了Java虚拟机的运行错误,栈溢出,内存溢出,是属于系统级别的错误, 程序已经无法解决。
Exception(异常):包括数组越界,空指针的异常,类型转换异常,超时异常,文件IO异常,非法参数异常,是属于运行时候出现的异常。
Error类
Error 是 Throwable 的子类,用来表示严重的系统错误,通常是程序员无法控制或处理的问题。一般不建议在程序中捕获或抛出 Error,因为它们表示 JVM 中的问题或者严重的系统故障,比如硬件错误或内存不足等。
常见的 Error
子类有:
·OutOfMemoryError
:JVM 内存耗尽,无法分配更多的对象。
·StackOverflowError
:递归太深,栈空间耗尽
·VirtualMachineError
:JVM 运行时遇到严重问题。
Exception类
其中Exception
又可以细分为两类:
Checked Exception(受检异常)
编译时必须要进行处理的异常,程序必须通过 try-catch
或 throws
语句显式处理。常见的例子有 IOException
、SQLException
等。它们一般表示外部环境的异常情况,如文件未找到、数据库连接失败等。
这是一段示例代码
public void readFile(String fileName) throws IOException {
FileReader file = new FileReader(fileName);
BufferedReader fileInput = new BufferedReader(file);
fileInput.readLine();
}
示例代码中FileReader
和 BufferedReader
可能抛出 IOException
,所以必须通过 throws
关键字声明或在代码中捕获。
Unchecked Exception(非受检异常)
运行时异常,不需要显式地在代码中进行捕获或声明。程序可以选择处理或忽略。常见的有 NullPointerException
、ArrayIndexOutOfBoundsException
、ArithmeticException
等。它们一般表示编程错误或逻辑问题。
总结
1.尽量不要捕获通用异常,而去使用特定的异常来进行捕获,提高代码的可读性
2.捕获异常后,尽量不取使用e.printStackTrance(),因为在分布式的环境中,无法找到StackTrance。
3.不要捕获 Throwable 或者
Exception
:捕获这些会让程序无法区分不同类型的异常,可能隐藏某些严重问题。应捕获具体的异常类型。
4.如果捕获异常后不做处理的话,最好不要取捕获通用的异常,防止其他异常被吞而导致的错误。
5.finally中不要返回return,finally
块中的代码无论是否发生异常都会执行,因此在 finally
中处理返回值或 return
可能会导致意外行为。最好不要在 finally
中改变方法的返回值。