在程序中总是存在各种错误,使应用程序在运行时终止。为了在程序执行过程中发生错误时能正常运行,可以使用 Java 提供的异常处理机制捕获可能发生的异常,对异常进行处理并使程序能正常运行。
在 Java 编程中,异常(Exception)是指在程序执行过程中出现的错误或异常情况。Java 中的异常是一种对象,它代表了程序在运行过程中的错误状态。对于不同类型的异常,Java 提供了不同的类来表示,它们的继承关系图如下:
Java 异常分为两类,分别为可检查异常(Checked Exception)和不可检查异常(Unchecked Exception)。
可检查异常又称为已检查异常,是指在编译时需要进行处理的异常。这些异常通常是由外部因素引起的,如文件不存在、网络连接中断等。如果不处理这些异常,编译器将报错。可检查异常必须使用 try-catch 块或者在方法签名中使用 throws 关键字进行处理。处理这些异常可以帮助程序在发生错误情况时进行适当的处理,增加程序的健壮性和可靠性。
的检查异常包括以下几种:
IOException(输入输出异常):当发生输入输出操作错误时抛出,如文件读写错误、网络连接错误等。
FileNotFoundException(文件未找到异常):当指定的文件不存在时抛出。
SQLException(SQL异常):当访问数据库发生错误时抛出。
ClassNotFoundException(类未找到异常):当试图加载不存在的类时抛出。
InterruptedException(中断异常):当线程在等待、休眠或阻塞状态下被中断时抛出。
ParseException(解析异常):当字符串无法被解析为特定格式时抛出。
NoSuchMethodException(方法未找到异常):当试图调用不存在的方法时抛出。
IllegalAccessException(非法访问异常):当试图访问私有方法或字段时抛出。
InvocationTargetException(调用目标异常):当通过反射调用方法时,被调用方法抛出异常时抛出。
MalformedURLException(URL格式异常):当URL的格式不正确时抛出。
该示例将使用 URL 解析一个网页地址,但是错误将 http:// 写成了 htp://,解析是抛出了 MalformedURLException 错误。代码如下:
import java.net.MalformedURLException; import java.net.URL; public class Demo { public static void main(String[] args) { try { new Demo().parseUrl("htp://www.hxstrive.com"); } catch (MalformedURLException e) { e.printStackTrace(); } } private URL parseUrl(String url) throws MalformedURLException { return new URL(url); } }
运行示例,输出如下:
java.net.MalformedURLException: unknown protocol: htp at java.net.URL.<init>(URL.java:593) at java.net.URL.<init>(URL.java:483) at java.net.URL.<init>(URL.java:432) at com.hxstrive.demo.Demo.parseUrl(Demo.java:19) at com.hxstrive.demo.Demo.main(Demo.java:12)
不可检查异常又称为未检查异常,是指在编译时不需要进行处理的异常。这些异常通常是由程序内部的错误引起的,如数组越界、空指针引用等。不可检查异常是RuntimeException 类及其子类的实例,它们不需要强制处理,但是可以选择进行处理。
的未检查异常包括以下几种:
NullPointerException(空指针异常):当程序试图访问空对象的方法或属性时抛出。
ArrayIndexOutOfBoundsException(数组越界异常):当程序试图访问数组中不存在的索引时抛出。
ClassCastException(类转换异常):当程序试图将一个对象强制转换为不兼容的类型时抛出。
IllegalArgumentException(非法参数异常):当方法接收到一个不合法的参数时抛出。
IllegalStateException(非法状态异常):当对象的状态不满足方法调用的前提条件时抛出。
ArithmeticException(算术异常):当发生数学运算错误时抛出,如除以零。
UnsupportedOperationException(不支持操作异常):当不支持某个方法或操作时抛出。
NumberFormatException(数字格式异常):当字符串无法转换为数字时抛出。
OutOfMemoryError(内存溢出错误):当程序无法申请到足够的内存时抛出。
StackOverflowError(栈溢出错误):当方法调用的层级过深导致栈空间不足时抛出。
该示例使用 Integer.valueOf() 方法将一个字符串解析成 int,如果字符串不能正常解析为 int,则将抛出 NumberFormatException 异常,代码如下:
public class Demo { public static void main(String[] args) { try { int val = Integer.valueOf("hello"); System.out.println("val = " + val); } catch (NumberFormatException e) { e.printStackTrace(); } } }
运行示例,输出如下:
java.lang.NumberFormatException: For input string: "hello" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.valueOf(Integer.java:766) at com.hxstrive.demo.Demo.main(Demo.java:8)