异常:程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。
世上没有百分之百完美的程序。程序总难免存在各式各样的问题。所以,程序中添加对于错误的处理机制是十分有必要的。这就好比人多的公共场所需要有防火防盗的安保系统一个道理。
捕获异常
异常处理格式
try {
//
有可能出现异常的语句
}
catch (Type1 e1) {
//
异常类型1处理代码
}
catch (Type2 e2) {
//
异常类型2处理代码
}
//
etc...
catch (TypeN en) {
//
异常类型n处理代码
}
finally {
//
不管有没有发生异常,finally语句块都会被执行
//
在 try...catch 异常处理机制中, finally关键字是可选的
}
try 关键字之后的程序块就是异常的监控区域。
多个 catch 关键字后面的程序块,则是针对每个要捕获的异常,所准备的相应处理程序。
finally 关键字之后的程序块,无论是否出现异常,总会被执行。 finally 关键字在 try...catch 机制中并不是必须的。
public
class ExceptionDemo02 {
public
static
void main(String args[]) {
System.out.println("********** 计算开始 ***********");
int i = 10;
int j = 0;
try {
int temp = i / j;
//
此处产生了异常
System.out.println("两个数字相除的结果:" + temp);
System.out.println("****************************");
}
catch (ArithmeticException e) {
System.out.println("出现异常了:" + e);
}
finally {
System.out.println("对与不对,我都在这里,不偏不移");
}
System.out.println("********** 计算结束 ***********");
}
};
范例代码
JAVA虽然提供了大量的异常类,但也不可能预见所有的异常情况。所以可以自己定义异常类来表示程序可能会遇到的特定问题。
要自定义异常类,必须从已有的异常类继承,最好选择功能相近的异常类继承。
//
自定义异常类,继承Exception类
class MyException
extends Exception {
public MyException(String msg) {
super(msg);
//
调用Exception类中有一个参数的构造方法,传递错误信息
}
};
public
class DefaultException {
public
static
void main(String args[]) {
try {
throw
new MyException("自定义异常。");
//
抛出异常
}
catch (Exception e) {
e.printStackTrace();
}
}
/*
Output:
MyException: 自定义异常。
at DefaultException.main(DefaultException.java:11)
*/
}
抛出异常
在定义一个方法时可以使用 throws 关键字声明,使用 throws 声明的方法表示此方法不处理异常,而交给方法的调用处进行处理。
public 返回值类型 方法名称(参数列表...)
throws 异常类{}
需要注意的是,如果异常类类型不是运行时异常类型,那么在调用这个方法时,不管是否有问题,都必须使用 try...catch 进行异常的捕获与处理。
class Div {
//
定义除法操作,如果有异常,则交给被调用处处理
public
int div(
int i,
int j)
throws Exception {
int temp = i / j;
return temp;
}
};
public
class ThrowsDemo01 {
public
static
void main(String args[]) {
Div div =
new Div();
//
div.div(10, 0);
//
如果不使用 try...catch 结构,编译器会认为出错
try {
System.out.println("除法操作:" + div.div(10, 0));
}
catch (Exception e) {
e.printStackTrace();
//
打印异常
}
}
};
范例代码
和 throws 不同,throw 关键字表示主动地抛出一个异常,抛出时直接抛出异常类的实例化对象即可。
public
class ThrowDemo01{
public
static
void main(String args[]){
try{
throw
new Exception("自己抛着玩的。") ;
//
抛出异常的实例化对象
}
catch(Exception e){
System.out.println(e) ;
}
}
};
范例代码
异常的类型
JAVA中所有的异常类都继承自 Throwable 类。
异常可分为两大类:Exception 和 Error。
Exception:一般指的是程序中出现的问题,可以通过 try...catch 处理。
Error:一般指的是JVM错误,程序无法处理。
Exception还可以再继续细分为运行时异常(RuntimeException)和非运行时异常。
运行时异常可以不使用 try...catch 进行处理。
非运行时异常
必须使用 try...catch 进行处理。
请看以下代码:
public
class RuntimeExceptionDemo01 {
public
static
void main(String args[]) {
int result = 0;
String str = "10";
String str2 = "abc";
result = Integer.parseInt(str);
//
将字符串中的数字转为int类型
System.out.println(result * result);
result = Integer.parseInt(str2);
//
试图将字符串中字母转为int类型时会出现异常
System.out.println(result * result);
}
};
执行以上代码时,再第二次调用Integer.parseIn()时会出现异常。我们看一下这个方法的定义:
public
static
int parseInt(String s)
throws NumberFormatException
这里使用了 throws 关键字,但是在实际调用时并没有使用 try...catch,编译器也没有报错。
这是因为所有继承自 RuntimeException 的类都可以不使用 try...catch 进行处理。在这种情况下,如果产生异常,将由 JVM 进行处理,此时肯定会中断程序。
所以,如果想要程序在出错时仍可以继续执行,最好还是使用 try...catch 的异常处理机制来处理。
参考资料
Java 编程思想
JAVA 开发实战宝典