1. 异常处理概述
Java是一门强类型语言,较其他语言而言,更易于编写健壮(robust)的程序。这是因为在Java中,为了避免莫名其妙的运行时错误,系统引入了异常(exception)机制。异常让程序员可以更好地管理错误信息,以提高程序的可靠性和健壮性。
在Java中,异常通常都是既有自带类型,如IllegalArgumentException、ArrayIndexOutOfBoundsException等,也有自定义类型,满足特定需求。
当Java程序运行时发生异常,程序执行会中断,交由 JVM(Java虚拟机)处理。有时确实需要中断程序执行,比如读文件出错,无法继续进行数据处理,或者说从网络访问得不到结果。但对于其他情况,比如输入错误,要求用户重新输入,这是更愿意使得程序保持运行并通过某种方式通知用户问题的存在。
2. throw语句
在Java中,throw是一种关键字,用于手动抛出异常。具体地说,语法如下:
throw throwableInstance;
throwableInstance是任何继承java.lang.Throwable类的类的实例。Java中Throwable类是所有错误异常类的基类。在Java中,有两种Throwable子类——Exception和Error。Exception表示程序在执行过程中发生了异常情况,是由程序员主动抛出的,也可由Java运行时环境抛出。而Error表示系统内部错误,比如内存不足,虚拟机错误等,不能直接由应用程序的代码控制和捕捉。
以下是只允许输入数字的类,若输入了不是数字,就手动抛出一个IllegalArgumentException:
// Example.java
public class Example {
public void convert(String s) {
for (int i = 0; i < s.length(); i++) {
if (!Character.isDigit(s.charAt(i))) {
throw new IllegalArgumentException("Not a number: " + s);
}
}
int number = Integer.parseInt(s);
System.out.println("Number: " + number);
}
}
3. catch语句
catch语句用于捕获特定的异常,以便程序可以决定如何处理这些异常。catch 块包含可能会抛出异常的程序代码。在语法上,catch块位于try块之后。Java中,try语句通常包括一段代码块,这段代码块包含可能会产生异常的单元。
catch块中必须包含处理程式代码。如果catch块没有处理程式,则程序会停止执行并以异常状态终止;如果catch块只是单单包含了一段文字,然后程序继续执行,这相当于捕捉了异常但又没有做处理。由于没有任何处理程序,此时与直接扔掉异常和直接忽视异常没有什么区别。
以下是一个在Java中使用catch语句的例子:
// Example.java
public class Example {
public void convert(String s) {
try {
for (int i = 0; i < s.length(); i++) {
if (!Character.isDigit(s.charAt(i))) {
throw new IllegalArgumentException("Not a number: " + s);
}
}
int number = Integer.parseInt(s);
System.out.println("Number: " + number);
} catch (IllegalArgumentException e) {
System.err.println(e.getMessage());
}
}
}
以上代码中,如果调用该方法时传入了非数字字符串,则抛出IllegalArgumentException。在抛出后,try块中的代码也就代表着执行失败,直接进入代码块中的catch语句,打印出异常信息。注意,catch语句语法格式也是try语句块中的代码的花括号后面接catch(),括号中是需要捕获的异常类型。
4. instanceof语句
如上所述,Java中使用try-catch机制处理异常——当我们知道某些代码有可能会触发异常时,可以选择将这些代码包裹在try块内,然后通过一个或多个catch块来捕获特定的异常。在某些情况下,我们需要针对不同的异常类型做出不同的处理。为了实现这一点,Java提供了instanceof(类型判断)语句。
下面是一个使用instanceof来处理异常的例子:
// Example.java
public class Example {
public void checkException(Throwable e) {
try {
throw e;
} catch (ArithmeticException f) {
System.out.println("ArithmeticException");
} catch (ArrayIndexOutOfBoundsException f) {
System.out.println("ArrayIndexOutOfBoundsException");
} catch (Throwable f) {
System.out.println("Throwable");
}
}
}
以上代码中定义了一个方法checkException(),用于检查不同类型的异常。在try块中通过throw e将e抛出。这样,我们甚至可以将异常向上抛,直到较为合适的catch块为止。
如果抛出的异常类型是ArithmeticException或ArrayIndexOutOfBoundsException,则语句块输出相应的异常信息;如果未匹配到上述两种异常,就走到默认情况——Throwable,输出Throwable。
5. 总结
异常处理是编程中必不可少的一个环节,Java中提供了充分的机制供我们使用。借助于throw、catch和instanceof三个关键字,能够高效地管理并及时修复异常。在实际开发过程中,尤其需要注意处理好异常的信息,比如抛出的异常,异常定义的明确程度等等。