什么是异常处理?
异常处理机制
Java的异常处理机制主要依赖于try、catch、finally、throw和throws五个关键字
使用try…catch捕获异常
语法结构
try
{
//业务实现代码
…
}
catch(Exception e)
{
alert 输入不合法
goto retry
}
如果执行try块里面的业务逻辑代码时出现异常,系统会自动生成一个异常对象,该异常对象被提交给Java运行时的环境,这个过程就叫抛出(throw)异常。
当Java运行时环境收到异常对象时,就会寻找能够处理这个异常对象的catch块,找到了合适的catch块,就将该异常对象交给该catch块。这个过程就叫捕获(catch)异常。
要是找不到捕获异常的catch块呢?那运行时环境终止,Java程序也将退出。
异常类的继承体系
Java异常捕获流程示意图

从上图中我们可以看出,Java把所有非正常的情况分两种,异常(Exception)和错误(Error)。Error错误,一般是指与虚拟机相关的问题,像系统崩溃、虚拟机错误、动态链接失败等。这种错误无法恢复或不可能捕获。
public class DivTest
{
public static void main(String[] args)
{
try
{
int a = integer.parseInt(args[0]);
int b = integer.parseInt(args[1]);
int c = a/b;
System.out.println(“您输入的两个数相除的结果是:” + c);
}
catch(IndexOutOfBoundsException ie)
{
System.out.println(“数组越界: 运行程序时输入的参数个数不够”);
}
catch(NumberFormatException ne)
{
System.out.println(“数字格式异常:程序只能接受整数参数”);
}
catch(ArithmeticException ae)
{
System.out.println(“算数异常”);
}
catch(Exception e)
{
System.out.println(“未知异常”);
}
}
}
Java7提供的多异常捕获
在Java7以前,每个catch块只能捕获一种类型的异常,但在Java7开始,一个catch块可以捕获多种类型的异常。
使用catch块捕获多种类型的异常时需要注意两个地方捕获多种异常时,多种异常类型之间用竖线(|)隔开。
捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值。
getMessage():返回该异常的详细描述字符串
printStackTrace():将该异常的跟踪信息输出到标准输出
printStackTrace(PrintStreams):将该异常的跟踪栈信息输出到指定输出流
Checked异常和Runtime异常体系
Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)。所有的RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的实例异常则被称为Checked异常。
Checked异常的处理方式有两种:
当前方法明确知道如何处理该异常,程序应该使用try…catch块来捕获该异常,然后在对应的catch块中修复该异常。
当前方法不知道如何处理这种异常们应该在定义该方法时声明抛出异常。
Runtime异常更加灵活,Runtime异常无须显式声明抛出,如果程序需要捕获Runtime异常,也可以使用try…catch块来实现。
语法:throws ExceptionClass1 , ExceptionClass2…
public class ThrowsTest2
{
public static void main(String[] args)
throws Exception
{
//因为test()方法声明抛出IOExceptin异常
//所以调用该方法的代码要么处于try…catch块中,要么处于另一个带throws声明抛出的方法中
test();
}
public static void test()throws IOException
{
//因为FileInputStream的构造器声明抛出IOException异常
//所以调用FileInputStream的代码要么处于try…catch块中
//要么处于另一个带throws声明抛出的方法中
FileInputStream fis = new FileInputStream("c.txt");
}
}
采用合适的方式结束异常活动