JAVA八股文:异常有哪些种类,可以举几个例子吗?Throwable类有哪些常见方法?
-
Throwable、Error 与 Exception
-
所有的异常类型都继承自
java.lang.Throwable
。 -
其中
Error
(比如OutOfMemoryError
、StackOverflowError
、类加载失败等)表示 JVM 自身或运行环境的问题,不应该也通常无法由应用程序去捕获或恢复,出现Error
通常意味着程序无法继续安全运行。 -
Exception
则代表应用层“可感知”的问题。
-
-
Checked Exception 与 Unchecked Exception
-
Checked Exception(受检异常)都是直接继承自
Exception
但不继承自RuntimeException
的异常。编译器强制要求方法要么throws
出去,让调用者去处理(声明式),要么在方法内部用try–catch
捕获并处理,否则代码都无法通过编译。 -
Unchecked Exception(非受检异常)指的是继承自
RuntimeException
或Error
的异常,编译器不强制你捕获或声明。最常见的如NullPointerException
、ArrayIndexOutOfBoundsException
、IllegalArgumentException
等。
-
-
为什么要设计 Checked Exception?
-
可恢复性:Checked 异常通常表示“外部环境或 IO 操作”这类有可能因外部条件(文件不存在、网络中断、权限不足等)而失败的场景。这类错误是可预见、有可能恢复的,Java 通过编译期强制你去“面对”这些错误——要么捕获,要么往上抛,让调用链上的某一层来决定如何恢复或提示用户。
-
增强 API 明示性:当一个方法声明了
throws IOException
,调用者一眼就能知道“这个方法存在读写失败的风险,需要处理或传递异常”,有助于写出更健壮的程序。 -
并不是因为“底层不安全”,而是因为它们涉及到对程序外部资源的访问(文件、网络、数据库、线程等待等),在这些操作中失败是常态,而不是程序 bug,需要业务层去合理应对。
-
Throwable类有哪些常见方法:
1.getMessage()
2.toString()
3.printStackTrace()
4.getLocalizedMessage()
-
getMessage()
取得最初传入的错误详情(构造时的那条 String)。String msg = e.getMessage();
-
toString()
默认实现返回getClass().getName() + ": " + getMessage()
,可用于快速打印异常类型和信息。System.out.println(e.toString());
-
getLocalizedMessage()
可被子类覆盖,用于返回基于当前环境(如不同语言)的错误信息。String localMsg = e.getLocalizedMessage();
-
printStackTrace()
将完整的异常栈信息输出到标准错误流(或指定的PrintStream
/PrintWriter
),方便定位出错位置。e.printStackTrace(); // 默认输出到 System.err e.printStackTrace(System.out); // 输出到控制台标准输出