第八章 异常处理
8.1 异常概述
在程序中,错误可能产生生于程序员没有预料到的各种情况,或者是超出了程序员可控范围的环境因素,这种在程序运行时可能出现的一些错误称为异常。
package hwd;
public class Baulik {//创建类
public static void main(String[] args) {//主方法
int result = 3 / 0;//定义并赋值
System.out.println(result);//打印结果
}
}
8.2 异常的分类
Java类库阿每个包中都定义了异常类、所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别时Error类和Exception类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误比较严重。Exception类称为非致命性类,可以通过捕捉处理使程序继续执行。
8.2.1 系统错误——Error
Error类及其子类通常用来描述Java运行系统中的内部错误,该类定义了常规环境不希望由程序捕获的异常。
8.2.2 异常——Exception
Exception是程序本身可以处理的异常,这种异常主要分为运行时异常和非运行时异常,程序中应当尽可能去处理这些异常。
1.运行时异常
运行时异常时程序运行过程中产生的异常,它是RuntimeException类及其子类异常,这些异常一班是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
Java中提供了常见的RuntimeException异常,这些异常可通过try...catch语句捕获。
package hwd;
public class Thundering {//创建类
public static void main(String[] args) {//主方法
String str = "1i1i";//定义字符串
System.out.println(str + "年龄是:");//打印结果
int age = Integer.parseInt("20L");//数据类型转换
System.out.println(age);//打印结果
}
}
2.非运行时异常
非运行时异常是RuntimeException类及其子类异常以外的异常。
package hwd;
public class FootballTeam {//创建类
private int playerNum;//创建属性
private String teamName;//创建属性
public FootballTeam() {//构造方法
Class.forName("com.mrsoft.Coach");//寻找教练类
}
public static void main(String[] args) {//主方法
FootballTeam team = new FootballTeam();//创建对象
team.teamName = "com.mrsoft";//调用并赋值
team.playerNum = 19;//调用并赋值
System.out.println("\n球队名称:" + team.teamName + "\n" + "球员数量:" + team.playerNum + "名");//打印结果
}
}
8.3 捕捉处理异常
系统会自动为非运行时异常提供两种解决方案,一种是使用throw关键字,一种是使用try...catch代码块。
try...catch代码主要用来对异常进行捕捉并处理。在实际使用时,该代码块还有一个可选的finally代码块,其语法如下
try{
//程序代码块
}
catch(Exceptiontype e) {
//对Exceptiontype的处理
}
finally{
//代码块
}
8.3.1 try...catch代码块
package hwd;
public class Take {//创建类
public static void main(String[] args) {//主方法
try {
String str = "1111";//try语句可能出现异常的代码
System.out.println(str + "年龄是:");//定义字符串变量
int age = Integer.paresInt("20L");//数据类型转换
System.out.println(age);//打印结果
} catch (Exception e){//catch代码块用来获取异常信息
e.printStackTrace();//输出异常性质
}
System.out.println("program over");//输出信息
}
}
8.3.2 finally代码块
完整的异常处理语句应该包含finally代码块,通常情况下,无论程序中有无异常发生,finally代码块中的代码都可以正常执行。
package hwd;
public class Take {//创建类
public static void main(String[] args) {//主方法
try {
String str = "1111";//try语句可能出现异常的代码
System.out.println(str + "年龄是:");//定义字符串变量
int age = Integer.paresInt("20L");//数据类型转换
System.out.println(age);//打印结果
} catch (Exception e){//catch代码块用来获取异常信息
e.printStackTrace();//输出异常性质
}finally{
System.out.println("program over");//输出信息
}
}
}
8.4 在方法中抛出异常
如果某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。
8.4.1 使用throws关键字抛出的异常
package hwd;
public class Shoot {//创建类
static void pop() throws NegativeArraySizeException{
//定义方法并抛出NegativeArraySizeException异常
int[] arr = new int[-3];//创建数组
}
public static void main(String[] args) {//主方法
try{//try语句处理异常2信息
pop();//调用方法
}catch (NegativeArraySizeException e){
System.out.println("pop()方法抛出的异常");//输出异常
}
}
}
8.4.2 使用throws关键字抛出异常
throws关键字通常用于在方法体中“制造”一个小异常,程序在执行到throw语句时立即终止,它后面的语句都不执行。使用throw关键字出异常的语法格式为:
throw new 异常类型名(异常信息);
package hwd;
public class ThrowTest {//创建类
public static void main(String[] args) {//主方法
int num1 = 25;//创建属性
int num2 = 0;//创建属性
int result;//创建属性
if(num2 == 0){//
//抛出ArithmeticException
throw new ArithmetiicException("这都不会,小学生都知道:除数不能为0");
}
result = num1 / num2;//计算
System.out.println("两个数的商为:" + result);//打印结果
}
}
8.5 自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分情况,但是有些情况是通过内置异常类无法识别的,
int age = -50;
System.out.println("王师傅今年" + age + "岁了");
在程序中使用自定义异常类,大体可以分为以下几个步骤
1 创建自定义异常类
2 在方法中通过throw关键字抛出对象
3 如果在当前抛出异常的方法中处理异常,可以使用try...catch代码块捕获并处理,否则,在方法的声明处通过throws关键字指明要抛给方法调用者的异常,继续进行下一步操作。
4 在出现异常方法的调用者中捕获处理异常。
package hwd;
public class MyException extends Exception {//创建自定义异常,继承Exception类
public MyException(String ErrorMessage){//构造方法
super(ErrorMessage);//父类构造方法
}
}
package hwd;
public class Tran {//创建类
//定义方法,抛出自定义的异常
static void avg(int age) throws MyException{
if(age < 0){//判断条件
throw new MyException("年龄不可以为负数");//错误信息
}else {
System.out.println("王师傅今年" + age + "岁了");//无异常信息
}
}
public static void main(String[] args) {//主方法
try{
avg(-50);//年龄值
} catch (MyException e){//try代码块处理可能出现异常的代码
e.printStackTrace();
}
}
}