异常处理分为七种类型
异常概述,异常的抛出与捕捉,java常见的异常类,自定义异常,在方法钟抛出异常,运行时异常,异常的使用原则
9.1异常概述
在程序中,异常可能由程序员没有预料到各种情况产生,也可能超出了程序员可控范围的环境因素影响,如用户的坏数据,试图打开一个根本不存在的文件等 。在java中,这种在程序运行时可能出现的一些错误为异常。异常是一个在程序执行期间发生的时间,他中断了正在执行的程序的正常指令
如下例题9.1 可以作为除数么?
package 第九章;
public class Baulk {//类名
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int result =3/0;//定义一个int类型的变量并复制 除数不能为零
System.out.println(result);//将变;
}
}
运行结果
9.1捕获异常代码
package 第九章;
public class Baulk {//类名
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
try {
int result =3/0;//定义一个int类型的变量并复制 除数不能为零
System.out.println(result);//将变;
}catch(ArithmeticException e) {
System.out.println("捕捉到算法异常");
}finally {
System.out.println("程序结束");
}
}
}
结果
9.2 异常的抛出与捕捉
为了保证程序有效地执行,需要对抛出的异常进行相应的处理。在Java中,如果某个方法抛出异常,既可以在当前方法中进行捕捉,而后处理该异常,也可以将该异常向上抛出,交由方法调用者来处理
9.2.1抛出异常
异常抛出后,如果不做任何处理的话,程序就会被终止,例如将一个字符串转换为整型 ,可以通过lnteger类的parseInt()方法来实现。但如果该字符串不是数字形式,parseInt()方法就会抛出异常,程序将会出现异常提示,实例代码如下;
抛出异常
package 异常;
public class Thundering {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
String str ="lili";//定义字符串
System.out.println(str+"年龄是:");//输出提示信息
int age =Integer.parseInt("20L");//数据类型转换
System.out.println(age);//输出age
}
}
结果
捕捉异常和抛出异常
代码
package 异常;
public class Thundering {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
try {
String str ="lili";//定义字符串
System.out.println(str+"年龄是:");//输出提示信息
int age =Integer.parseInt("20L");//数据类型转换
System.out.println(age);//输出age
}catch(NumberFormatException e) {//捕捉异常
System.out.println("捕捉到算法异常");
}finally {
System.out.println("程序结束");//输出
}
}
}
结果
9.2.2捕捉异常
Java 语言的异常捕获结构由try、catch和finally3部分组成。其中,try语句块存放的是可能发生异常的 Java 语句;catch 语句块在 try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论 try语句块中的代码如何退出,都将执行 finally 语句块。
语法如下:
try{
1/程序代码块
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
catch(Exceptiontype2e){
1/对Exceptiontype2的处理
finally{
//程序代码快
}
通过异常处理器的语法可知,异常处理器大致分为 try-catch 语句块和 finally语句块
try-catch语句块
下面将例题9.2中的代码进行修改
代码
package 异常;
public class Take {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
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 voer");//输出信息
}
}
结果
从以上代码和图片所述,可以看出程序仍然输出最后的提示信息,没有应为异常而终止,在上面代码图中,将可能出现异常的代码快用try-catch语句快进行处理,当try语句块中的语句发生异常时,程序就会跳转到catch语句块中执行,执行完catch语句块中的程序代码后,将继续执行catch语句块后其他代码,而不会执行try语句块中发生的异常语句后面的代码。由此可知,Java的异常处理时结构化的 ,不会应为一个异常影响整个程序的执行
finally语句块
完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之前的try_catch
语句快是否顺利执行finally语句。但是,在以下4中特殊情况下 finally快不会被执行
1.在finally语句块中发生异常
2.在前面的代码中使用System.exit()退出程序
3.程序所在的线程死亡
4.关闭cpu
9.3 java的常见的异常类
在java中,提供了一些二机场了用来描写经常发生的异常,其中,有的需要程序员来进行捕获处理或声明抛出,有的是有java虚拟机自动进行捕获处理
9.4自定义异常
使用java内置的异常类可以描述在变成时出现的大部分异常情况。除此之外用户只需要继承Exception类即可自定义异常类。在程序中使用自定义异常类大体可分为以下几个步骤
1.创建自定义异常类
2.在方法中通过throw关键字抛出异常对象
3.如果在当前抛出异常的方法中处理异常,可以使用 try_catch语句快捕获并处理否则在方法的声明出通throws关键字知名要怕出给方法调用者异常,继续进行下一步操作
例题9.4如何创建自定义异常
代码
package 异常;
public class MyException extends Exception{//创建自定义异常,继承Exception类
public MyException (String ErrorMessage) {//构造方法
super(ErrorMessage);///父类构造方法
}
例题9.5自定义异常的抛出和捕捉
package 异常;
public class Tran {//创建类
static int avg(int number1,int number2)throws MyException{//定义方法 抛出异常
if(number1< 0 ||number2<0) {//判断方法中参数是否满足指定条件
throw new MyException("不可以使用负数");//错误信息
}
if(number1>100 ||number2>100) {//判断方法中参数是否满足指定条件
throw new MyException("数值太大了");//错误信息
}
return (number1+number2)/2;//将参数的平均值返回
}
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
try {//try语句块处理可能出现的异常代码
int result=avg(-1,5);//调用avg()方法
System.out.println(result);//将avg()方法的返回值输出
}catch(MyException e) {
System.out.println(e);//输出异常信息
}
}
}
结果
9.5在方法中抛出异常
若某个方法可能会发生异常,但不想在当前方法中处理这个异常,但不想再当前方法中处理这个异常,则可以使用 throws throw 关键字在方法中抛出异常
9.5.1使用throws关键字抛出异常
throws关键字通常被应用重载声明方法时,用来指定方法可能抛出的异常,多个异常可使用逗号隔开
例题9.6指明异常起源于何处
代码
package 异常;
public class Shoot {//创建类
static void pop()throws NegativeArraySizeException{//定义方法并抛出异常
int[]arr=new int[-3];//创建数组
}
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
try {//try语句处理异常信息
pop();//调用方法
}catch (NegativeArraySizeException e) {
System.out.println("pop()方法抛出的异常");//输出异常
}
}
}
结果
从例题9.6的运行结果所示
使用throws关键字将异常抛给上一级后,如果不象处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码
9.5.2 使用throw关键字抛出异常
throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止它后面的语句都不执行,通过throw抛出异常后,如果想在上一级的代码中捕获并处理异常则需要在抛出异常的方法中使用throw关键字在方法的声明中指明抛出的异常;如果要捕捉throw抛出的异常,则必须使用tryu-catch语句 throw通常用来抛出用户自定义异常下面介绍throw的用法
例题9.7创建自定义异常
代码
package 异常;
public class MyException extends Exception{//创建自定义异常,继承Exception类
String message;//定义一个字符串类型变量
public MyException (String ErrorMessage) {//构造方法
message = ErrorMessage;///父类构造方法
}
public String getMessage() {//覆盖getMessage
return message;
}
}
例题9.8 使用throw关键字波卓自定义异常
代码
package 异常;
public class Captor {//创建类
static int quotient(int x,int y)throws MyException{//定义方法抛出异常
if(y<0) {//判断是否小于0
throw new MyException("除数不能为0");//异常信息
}
return x/y;//返回值
}
public static void main(String[] args) {//主函数
// TODO Auto-generated method stub
try {///try语句块包含可能发生的语句
int result =quotient(3,-1);//调用方法quptient()
}catch(MyException e) {//处理自定义异常
System.out.println(e.getMessage());//输出异常信息
}catch(ArithmeticException e) {//处理ArithmeticException
System.out.println("除数不能为0");//输出提示信息
}catch(Exception e){//处理其他异常
System.out.println("程序发生了其他的异常");//输出提示信息
}
}
}
结果