try{
// 代码块
}
catch(Excepton1 e){
//对Excepton1处理
}
catch(Excepton2 e){
//对Excepton2处理
}
...
finally{
//代码块
}
异常概述
在程序中,异常可能由程序员没有预料到的各种情况产生,也可能由超出了程序员可控范围的环境因素产生,如用户的坏数据,试图打开一个根本不存在的文件等。在Java中,这种在程序运行时可能出现的一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
package 第九章;
public class Baulk { //创建类Baulk
public static void main(String[] args) { //主方法
// TODO 自动生成的方法存根
try {
int result=3/0; //定义int型变量并赋值
System.out.println(result); //将变量输出
}catch (ArithmeticException e) {
System.out.println("捕捉到算法异常");
}finally {
System.out.println("程序结束");
}
}
}
ArithmeticException 算法异常
异常的抛出与捕捉
异常抛出后,如果不做任何处理,程序就会被终止。例如,将一个字符串转换为整形,可以通过Integer类的parseInt()方法来实现。但如果该字符串不是数字形式,parseInt()方法就会抛出异常,程序将在出现异常的位置终止,不在执行。
package 第九章;
public class Thundering { //创建类
public static void main(String[] args) { //主方法
// TODO 自动生成的方法存根
try {
String str="lili"; //定义字符串
System.out.println(str+"年龄是:"); //输出的提示信息
int age=Integer.parseInt("20L"); //数据类型的转换
System.out.println(age); //输出信息
}catch (NumberFormatException e) {
System.out.println("捕捉到数字格式异常");
}finally {
System.out.println("程序结束");
}
}
}
NumberFormatException 数字格式异常
捕捉异常
Java语言的异常捕获结构由try,catch和finally3部分组成。其中,try语句块存放的是可能发生异常的Java语句;catch语句块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。语法如下
try-catch语句块
package 第九章;
public class Take { //创建类
public static void main(String[] args) {
// TODO 自动生成的方法存根
try { //try
String str="lili"; //定义字符串变量
System.out.println(str+"年龄是:"); //输出的信息
int age=Integer.parseInt("20L"); //数据类型的转换
System.out.println(age); //
}catch(Exception e) { //catch语句块用来获取异常信息
e.printStackTrace(); //输出异常性质
}
System.out.println("program over"); //输出信息
}
}
finally语句块
完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之前的try-catch语句块是否顺利执行完毕,都会执行finally语句。但是,在以下4种特殊情况下,finally块不会被的执行:
在finally语句块中发生了异常
在前面的代码中使用System.exit()退出程序
程序所在的线程死亡
关闭CPU
Java常见的异常类
自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户只需继承Exception类即可自定义异常类。在程序中使用自定义异常类,大体可分以下几个步骤:
1 创建自定义异常类。
2 在方法中通过throw关键字抛出异常对象
3 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作
4 在出现异常的方法的调用者中捕获并处理异常。
package 第九章;
public class MyException1 extends Exception{ //创建自定义异常类
String message; //定义String类型变量
public MyException1(String ErrorMessage) { //父类方法
message=ErrorMessage;
}
public String getMessage() { //覆盖getMessage()方法
return message;
}
}
package 第九章;
public class Tran {
static int avg(int number,int number2)throws MyException {
//number和number2一定要在0~100之间
if(number<0 || number2<0) {
throw new MyException("不可以使用负数");
}
if(number>100 || number2>100) {
throw new MyException("数值太大了");
}
return(number+number2)/2;
}
public static void main(String[] args) {
// TODO 自动生成的方,法存根
try {
int result=avg(102,150);
System.out.println(result);
}catch(MyException e) {
System.out.println(e);
}
}
}
在方法中抛出异常
使用throws关键字抛出异常
package 第九章;
public class Shoot { //创建类
static void pop()throws NegativeArraySizeException{
//定义方法并抛出NegativeArraySizeException 异常
int[]arr=new int[-3]; //创建数组
}
public static void main(String[] args) { //主方法
// TODO 自动生成的方法存根
try { //try语句处理异常信息
pop(); //调用pop()方法
}catch (NegativeArraySizeException e) {
System.out.println("pop()方法抛出的异常"); //输出异常信息
}
}
}
使用throw关键字抛出异常
package 第九章;
public class MyException1 extends Exception{ //创建自定义异常类
String message; //定义String类型变量
public MyException1(String ErrorMessage) { //父类方法
message=ErrorMessage;
}
public String getMessage() { //覆盖getMessage()方法
return message;
}
}
package 第九章;
public class Captor { //创建类
static int quotient(int x,int y)throws MyException{ //定义方法抛出异常
if(y<0) { //判断参数是否小于0
throw new MyException("除数不能是负数"); //异常信息
}
return x/y; //返回值
}
public static void main(String[] args) { //主方法
// TODO 自动生成的方法存根
try { //try语句块包含可能发生异常的语句
int result=quotient(3,-1); //调用方法quotient()
}catch(MyException e) { //处理自定义异常
System.out.println(e.getMessage());
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
}catch(Exception e) {
System.out.println("程序发生了其他的异常");
}
}
}
运行时异常
RuntimeException 常是程运行过程中抛出的异常。Java类库的每个包中都定义了异常类,所这些类都是Throwable 类子类Throwable 类派生了两个子类,分别是 Exception 类和 Error 类。类及其子类用来描述Jav系统中内错误及资尽的错误,这类错误比较严重。Excen类称为非致命性类,可以通过捕捉处理使程序继续执行。Exception类根据错误发生的原因 RuntimeException异常和除RuntimeException 之外的异常,如图9.8所示。
Java中提供了常见的RuntimeException异常,这些异常可通过try-catch语句块捕获。
异常的使用原则
Jave异常强制用户考程的强健性和安全性。异常处理不应用来控制程的正常流程。美生要作用是排获程序在远行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异能。可速有以下几条原则:
当前方法声明中使用trycatch语句获异常。
己一个方法被爱盖时,爱盖它的方法必须抛出相同的异常或异常的子类。
如果父类地出多个异常,则爱盖方法必须抛出那些异常的一个子集,不能抛出新异常。