- 浏览: 73938 次
- 性别:
- 来自: 天津
文章分类
最新评论
第一.异常的概念:异常就是程序在运行中的错误,程序中的异常用异常类来描述。
第二:对异常的认识
1.异常是运行时错误,编译时错误不是异常
2.java中对异常的处理是用类来描述的,这种类称为异常类,描述程序运行时候的错误。
3.自定义异常:例如我定义一个类来描述异常WaterException(水灾类)
4.异常类能够继承父类:Throwable(异常类的父类)
5.Throwable的直接子类 是Error和Exception,所以Throwable是所有异常类的父类。而Throwable的父类是Object.
Error:程序没法处理的异常(也就是程序员无法控制的异常),例如程序运行时候电脑没电了,或者内存溢出(原因是自己电脑内存太小),也就是说程序运行的环境出问题了
Exception:程序能够合理的进行捕获的异常。
6.Exception又包含两种情况:运行时异常 和 检查异常(预防)
1).运行时异常:包含RuntimeException和他的子类,出现RuntimeException类型错误,可以修改程序中的代码,也可以处理,(方法一修改程序,方法二处理,两种方法选择其一)
2).检查异常:除了运行时异常之外的异常都是检查异常。如果产生了异常,必须处理,因此程序会有错误提示。处理有两种方式,一个是trycatch结构,一个是throws
异常有不确定性,异常我们对异常的处理也都是预防(如果发生了我们就怎么怎么办)
3).为什么检查异常必须处理呢?因为检查异常是系统定义好的,因此如果不处理他会显示出错误的虚线,当鼠标放在错误虚线上他就会出现处理方法
7.
1).java默认处理异常的方式:
jvm打印错误信息,程序中断(出现异常的时候,jvm自动产生一个该异常对应的异常类的对象,jvm捕获了这个异常,输出错误信息,程序中断)
2).自己处理异常(运行时异常):try catch:试图捕获异常,(这是预防性的),try里面的代码如果出现异常,这段代码会产生一个异常对象,这个异常对象在catch中匹配
3).自己处理异常(检查异常):检查异常必须处理,(看异常类是什么类型的,如果不是运行时异常就必须处理),检查异常两种处理方式:try catch和throws
第三:异常的代码分析:
1.异常的出现:此时产生异常类的对象并被jvm捕获,程序中断。
public class demo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);//1,创建对象
System.out.println("请输入一个整数:");
//2.接收键盘输入的值,当输入的不是整数的时候,就会产生输入不匹配异常。遇到异常程序将会中断。这种中断是程序的默认处理方法,由java虚拟机jvm来处理
//java虚拟机怎么知道有异常?答:当程序执行中发生异常,将会产生异常对应的描述的类的对象,该对象会被虚拟机捕获掉,被虚拟机捕获后程序就中断了。因此需要程序员来捕获,不能让虚拟机来捕获
int x=input.nextInt();
System.out.println("x="+x);
}
}
2.分析try catch结构:是试图捕获的意思。
public class demo1 {
public static void main(String[] args) {
try{
Scanner input = new Scanner(System.in);
System.out.println("请输入一个整数:");
int x=input.nextInt();//当这里输入的不是整数的时候,会被catch捕获,去执行catch了。因此不会再执行try里面的内容了
System.out.println("x="+x);//这句话不会输出
System.out.println("哈哈哈哈哈哈");//这句话也不会输出
}catch(Exception ex){//Exception是个类,ex就是具体的对象,ex输出的结果就是类名:java.util.InputMismatchException
System.out.println(ex instanceof InputMismatchException);//返回ture。这里是父类引用子类的对象
System.out.println("发生类型不匹配异常"+ex);
}
System.out.println("发生异常了");//这句话会被输出,这样保证了程序不会被中断、也就是说异常被处理之后程序就会继续执行
}
}
3.多重catch与finally
//多重catch
public static void main(String[] args) {
try{
Scanner input=new Scanner(System.in);
System.out.println("请输入第一个整数:");
int x=input.nextInt();
System.out.println("请输入第二个整数:");
int y=input.nextInt();
int z=x/y;//除0异常
System.out.println("z"+z);
int[] arr=new int[3];
System.out.println(arr[3]);//数组下标越界了
}catch(InputMismatchException ex){
System.out.println("发送类型不匹配异常,必须输入整数");
}catch(ArithmeticException ex){
System.out.println("除数不能为0异常");
}catch(Exception ex){//在此程序中,他将捕获ArrayIndexOutOfBoundsException异常,数组下标越界异常
//ex.printStackTrace();//打印异常信息,其实跟+ex差不多
System.out.println("如果有上面异常类不能捕获到的异常,我来进行捕获"+ex);
}finally{//有没有异常都会被执行。这个finally经常做的事情是资源的释放,例如关闭数据库连接等
System.out.println("这里的内容是最终都会被执行到的内容,不管是不是有异常都会执行到这个");
}
}
4.运行时异常:
//1.检查异常,必须要被处理(抛出或者捕获)。检查异常是系统定义好的,因此如果不处理他会显示出错误的虚线,当鼠标放在错误虚线上他就会出现处理方法(try或throws)。
//2.能出现红线和出现错误的处理方式的原因是系统已经把哪些东西是检查异常提前定义好了。
//throws:声明异常:告诉方法的调用者,该方法可能发生的异常。
//throw:抛出异常
public static void main(String[] args) {
/* try {
Class.forName("");//找不到这个类异常。检查异常必须要处理
} catch (ClassNotFoundException e) {
e.printStackTrace();
}*/
//第一种情况:对运行时异常不捕获的情况
div(10,0);//调用者没有对异常进行处理,因为div声明的异常是个运行时异常,程序员可以处理也可以不处理,程序员不处理的时候就会走系统默认的处理方式,也就是程序中断。
//第二种情况:对运行时异常捕获的情况
try{
div(10,0);
}catch(Exception ex){//这里这个异常对象就是下面的new ArithmeticException。因此这里输出传入实参有误java.lang.ArithmeticException: 你数学有问题
System.out.println("传入实参有误"+ex);
}
}
//throws声明该方法可能会发生ArithmeticException异常。会把异常给调用者,让调用者来处理
public static void div(int x,int y) throws ArithmeticException{
if(y==0){//加了判断如果有错误提前进入异常
//创建可能产生的异常对象。如果发生异常,本来是在int z=x/y的时候产生异常,现在我提前抛出异常。程序从这一行将会中断。
throw new ArithmeticException("你数学有问题");//这里输出:java.lang.ArithmeticException: 你数学有问题
}
int z=x/y;
System.out.println(z);
}
5.检查异常:调用者必须处理
public static void main(String[] args) {
//main方法调用了div方法,因此main方法需要对div的异常进行处理,处理方式有两种,一个是捕获异常trycatch,另一个是继续向上抛出异常throws
try {
div(10,0);
} catch (Exception e) {
e.printStackTrace();
System.out.println("分母不能为0"+e);
}
}
//这个方法使用了throws对可能发生的异常进行了声明,但是声明的异常类是个Exception类型的,他是所有异常的父类,也就是说他包括检查异常和运行时异常
//既然包含检查时异常,就要对异常进行捕获,因此需要调用者进行捕获,否则程序将会报错
public static void div(int x,int y) throws Exception{
int z=x/y;
System.out.println(z);
}
6.自定义异常:我自己创建了一个洪灾异常
public class WaterException extends Exception{
private int grade=0;//洪灾等级
public WaterException(){//无参构造
super("水漫金山....");//异常的具体描述
this.grade=5;
}
public WaterException(String msg,int grade){//构造函数
super(msg);//调用的是父类的方法
this.grade=grade;
}
//重写父类的方法
public void printStackTrace(){
if(grade==5){
//ex有两个方法:
//super.getMessage();//得到的是汉字
//super.getStackTrace();//打印的不是汉字
System.out.println("WaterException"+super.getMessage());
}else if(grade==10){
......
}
}
}
第四:常见的异常类:
ClassCastException:类型转换异常(在多肽的时候经常有类型转换)
InputMismatchException:输入不匹配异常(输入类型不匹配)
ArithmeticException:算数异常(比如说除数不能为0)
ArrayIndexOutOfBoundsException:数组下标越界异常
第五:总结
1.用try-catch直接去“处理”(捕获)异常
2,但是如果我不想去处理(捕获),那我就在我的方法名后面声明这个异常,具体怎么办交给调用者
3,调用者如果调用一个方法(这个方法含有运行时异常),如果这个被调用者声明的是一个运行时异常,调用者可以不“处理”该方法
4.如果调用者调用的一个方法(这个方法是检查异常),如果这个被调用者声明了一个检查异常,那么调用者必须对对该方法进行“处理”,(因为如果不处理,这里会报着错)
“处理”方式有两种,一个是继续抛异常,另一个是用try-catch语句去捕获这个可能出现的异常
5.对于程序员知道可能会发生异常的时候,用throw去抛出异常,抛出之后有具体的异常解释(如果不自己抛出,java虚拟机会给你抛出,但这种抛出不友好,一般人看不懂)。用throw抛出异常之后程序会中断
第二:对异常的认识
1.异常是运行时错误,编译时错误不是异常
2.java中对异常的处理是用类来描述的,这种类称为异常类,描述程序运行时候的错误。
3.自定义异常:例如我定义一个类来描述异常WaterException(水灾类)
4.异常类能够继承父类:Throwable(异常类的父类)
5.Throwable的直接子类 是Error和Exception,所以Throwable是所有异常类的父类。而Throwable的父类是Object.
Error:程序没法处理的异常(也就是程序员无法控制的异常),例如程序运行时候电脑没电了,或者内存溢出(原因是自己电脑内存太小),也就是说程序运行的环境出问题了
Exception:程序能够合理的进行捕获的异常。
6.Exception又包含两种情况:运行时异常 和 检查异常(预防)
1).运行时异常:包含RuntimeException和他的子类,出现RuntimeException类型错误,可以修改程序中的代码,也可以处理,(方法一修改程序,方法二处理,两种方法选择其一)
2).检查异常:除了运行时异常之外的异常都是检查异常。如果产生了异常,必须处理,因此程序会有错误提示。处理有两种方式,一个是trycatch结构,一个是throws
异常有不确定性,异常我们对异常的处理也都是预防(如果发生了我们就怎么怎么办)
3).为什么检查异常必须处理呢?因为检查异常是系统定义好的,因此如果不处理他会显示出错误的虚线,当鼠标放在错误虚线上他就会出现处理方法
7.
1).java默认处理异常的方式:
jvm打印错误信息,程序中断(出现异常的时候,jvm自动产生一个该异常对应的异常类的对象,jvm捕获了这个异常,输出错误信息,程序中断)
2).自己处理异常(运行时异常):try catch:试图捕获异常,(这是预防性的),try里面的代码如果出现异常,这段代码会产生一个异常对象,这个异常对象在catch中匹配
3).自己处理异常(检查异常):检查异常必须处理,(看异常类是什么类型的,如果不是运行时异常就必须处理),检查异常两种处理方式:try catch和throws
第三:异常的代码分析:
1.异常的出现:此时产生异常类的对象并被jvm捕获,程序中断。
public class demo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);//1,创建对象
System.out.println("请输入一个整数:");
//2.接收键盘输入的值,当输入的不是整数的时候,就会产生输入不匹配异常。遇到异常程序将会中断。这种中断是程序的默认处理方法,由java虚拟机jvm来处理
//java虚拟机怎么知道有异常?答:当程序执行中发生异常,将会产生异常对应的描述的类的对象,该对象会被虚拟机捕获掉,被虚拟机捕获后程序就中断了。因此需要程序员来捕获,不能让虚拟机来捕获
int x=input.nextInt();
System.out.println("x="+x);
}
}
2.分析try catch结构:是试图捕获的意思。
public class demo1 {
public static void main(String[] args) {
try{
Scanner input = new Scanner(System.in);
System.out.println("请输入一个整数:");
int x=input.nextInt();//当这里输入的不是整数的时候,会被catch捕获,去执行catch了。因此不会再执行try里面的内容了
System.out.println("x="+x);//这句话不会输出
System.out.println("哈哈哈哈哈哈");//这句话也不会输出
}catch(Exception ex){//Exception是个类,ex就是具体的对象,ex输出的结果就是类名:java.util.InputMismatchException
System.out.println(ex instanceof InputMismatchException);//返回ture。这里是父类引用子类的对象
System.out.println("发生类型不匹配异常"+ex);
}
System.out.println("发生异常了");//这句话会被输出,这样保证了程序不会被中断、也就是说异常被处理之后程序就会继续执行
}
}
3.多重catch与finally
//多重catch
public static void main(String[] args) {
try{
Scanner input=new Scanner(System.in);
System.out.println("请输入第一个整数:");
int x=input.nextInt();
System.out.println("请输入第二个整数:");
int y=input.nextInt();
int z=x/y;//除0异常
System.out.println("z"+z);
int[] arr=new int[3];
System.out.println(arr[3]);//数组下标越界了
}catch(InputMismatchException ex){
System.out.println("发送类型不匹配异常,必须输入整数");
}catch(ArithmeticException ex){
System.out.println("除数不能为0异常");
}catch(Exception ex){//在此程序中,他将捕获ArrayIndexOutOfBoundsException异常,数组下标越界异常
//ex.printStackTrace();//打印异常信息,其实跟+ex差不多
System.out.println("如果有上面异常类不能捕获到的异常,我来进行捕获"+ex);
}finally{//有没有异常都会被执行。这个finally经常做的事情是资源的释放,例如关闭数据库连接等
System.out.println("这里的内容是最终都会被执行到的内容,不管是不是有异常都会执行到这个");
}
}
4.运行时异常:
//1.检查异常,必须要被处理(抛出或者捕获)。检查异常是系统定义好的,因此如果不处理他会显示出错误的虚线,当鼠标放在错误虚线上他就会出现处理方法(try或throws)。
//2.能出现红线和出现错误的处理方式的原因是系统已经把哪些东西是检查异常提前定义好了。
//throws:声明异常:告诉方法的调用者,该方法可能发生的异常。
//throw:抛出异常
public static void main(String[] args) {
/* try {
Class.forName("");//找不到这个类异常。检查异常必须要处理
} catch (ClassNotFoundException e) {
e.printStackTrace();
}*/
//第一种情况:对运行时异常不捕获的情况
div(10,0);//调用者没有对异常进行处理,因为div声明的异常是个运行时异常,程序员可以处理也可以不处理,程序员不处理的时候就会走系统默认的处理方式,也就是程序中断。
//第二种情况:对运行时异常捕获的情况
try{
div(10,0);
}catch(Exception ex){//这里这个异常对象就是下面的new ArithmeticException。因此这里输出传入实参有误java.lang.ArithmeticException: 你数学有问题
System.out.println("传入实参有误"+ex);
}
}
//throws声明该方法可能会发生ArithmeticException异常。会把异常给调用者,让调用者来处理
public static void div(int x,int y) throws ArithmeticException{
if(y==0){//加了判断如果有错误提前进入异常
//创建可能产生的异常对象。如果发生异常,本来是在int z=x/y的时候产生异常,现在我提前抛出异常。程序从这一行将会中断。
throw new ArithmeticException("你数学有问题");//这里输出:java.lang.ArithmeticException: 你数学有问题
}
int z=x/y;
System.out.println(z);
}
5.检查异常:调用者必须处理
public static void main(String[] args) {
//main方法调用了div方法,因此main方法需要对div的异常进行处理,处理方式有两种,一个是捕获异常trycatch,另一个是继续向上抛出异常throws
try {
div(10,0);
} catch (Exception e) {
e.printStackTrace();
System.out.println("分母不能为0"+e);
}
}
//这个方法使用了throws对可能发生的异常进行了声明,但是声明的异常类是个Exception类型的,他是所有异常的父类,也就是说他包括检查异常和运行时异常
//既然包含检查时异常,就要对异常进行捕获,因此需要调用者进行捕获,否则程序将会报错
public static void div(int x,int y) throws Exception{
int z=x/y;
System.out.println(z);
}
6.自定义异常:我自己创建了一个洪灾异常
public class WaterException extends Exception{
private int grade=0;//洪灾等级
public WaterException(){//无参构造
super("水漫金山....");//异常的具体描述
this.grade=5;
}
public WaterException(String msg,int grade){//构造函数
super(msg);//调用的是父类的方法
this.grade=grade;
}
//重写父类的方法
public void printStackTrace(){
if(grade==5){
//ex有两个方法:
//super.getMessage();//得到的是汉字
//super.getStackTrace();//打印的不是汉字
System.out.println("WaterException"+super.getMessage());
}else if(grade==10){
......
}
}
}
第四:常见的异常类:
ClassCastException:类型转换异常(在多肽的时候经常有类型转换)
InputMismatchException:输入不匹配异常(输入类型不匹配)
ArithmeticException:算数异常(比如说除数不能为0)
ArrayIndexOutOfBoundsException:数组下标越界异常
第五:总结
1.用try-catch直接去“处理”(捕获)异常
2,但是如果我不想去处理(捕获),那我就在我的方法名后面声明这个异常,具体怎么办交给调用者
3,调用者如果调用一个方法(这个方法含有运行时异常),如果这个被调用者声明的是一个运行时异常,调用者可以不“处理”该方法
4.如果调用者调用的一个方法(这个方法是检查异常),如果这个被调用者声明了一个检查异常,那么调用者必须对对该方法进行“处理”,(因为如果不处理,这里会报着错)
“处理”方式有两种,一个是继续抛异常,另一个是用try-catch语句去捕获这个可能出现的异常
5.对于程序员知道可能会发生异常的时候,用throw去抛出异常,抛出之后有具体的异常解释(如果不自己抛出,java虚拟机会给你抛出,但这种抛出不友好,一般人看不懂)。用throw抛出异常之后程序会中断
发表评论
-
二分法、冒泡排序
2017-03-03 10:31 358import java.util.Scanner;/** ... -
for、while循环,打印三角形、菱形
2017-03-03 09:54 545import java.util.Scanner;publi ... -
单线程与多线程
2016-01-16 12:10 616单线程:按照程序 ... -
字节流,字符流,对象流,序列化,持久化
2016-01-15 11:25 675第一:读写字符串 input(读文件里的内容) 的步骤: ... -
深入反射、IO文件、字节流
2016-01-15 11:11 465第一:反射相关的概念 1.反射中调用构造函数默认都是调用 ... -
百度字符串
2016-01-07 17:41 5491、length() 字符串的长度 例:char char ... -
map集合转化成list集合
2015-12-28 15:52 1669package emp; public class Emp ... -
反射
2015-12-28 15:47 421第一:反射的概念 1.(1).java程序源文件(属性和 ... -
泛型
2015-12-28 15:24 397第一:泛型:问题:1.在运算时候必须要向下转型。向下转型存 ... -
map集合和他的实现类hasHmap(不安全)和hashTable(安全)
2015-12-28 15:15 607第一:初步认识map 1.键值对(key与value是一一 ... -
set接口和它的实现类treeset和hashset
2015-12-01 22:50 538第一:set接口:set接口里面的元素不能重复,因此nul ... -
Collection集合根接口、两个子接口list和set
2015-11-30 22:29 618第一:由数组的 ... -
String与StringBuffer、Date日期与SimpleDateFormat 简单的日期格式化
2015-11-29 22:31 641第一:String类:字符串常量1.String是一个类, ... -
快捷键
2015-11-24 23:06 2881.导包:ctrl+shift+O 2.找类:ctrl+shi ... -
向下转型与instanceof 关键字,object类(系统类)中的常用方法
2015-11-24 23:02 944第一:向下转型 1.向下 ... -
接口,抽象类与接口的关系。多肽、向上转型与动态绑定的引出
2015-11-23 22:04 454第一:在引入接口之前 ... -
关键字:extends继承、abstract 抽象,继承与抽象类之间的关系、final最终的
2015-11-22 17:02 853----继承 1.extends的是继承或者扩展的意思。父类写 ... -
由static引出单例模式
2015-11-22 16:20 307单例模式的特点:保证在整个应用程序中只存在一个对象 单例模式的 ... -
this和static关键字,javadoc文档的产生
2015-11-22 15:51 334----this和static关键字 public class ... -
java内存分析
2015-11-22 15:16 2571.局部变量中的引用类型是把地址存到栈内存中,由栈内存中的地址 ...
相关推荐
### 异常类:自定义异常类 #### 知识点概述 在程序设计中,异常处理是一项重要的机制,用于管理程序运行时可能发生的错误或意外情况。Java 提供了一套完整的异常处理机制,其中包括标准异常类以及允许开发人员...
实验报告8++内部类与异常类
1. **自定义异常类**: `NotEnoughBalanceException`是继承自`Exception`类的,用于表示尝试从`SavingsAccount`类中取出的金额超过了账户余额。当`withdraw`方法检测到这种情况时,会抛出这个异常,并附带当前余额...
Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...
### 异常类的使用详解 #### 实验背景与目的 在本次实验中,主要目的是让学生理解并掌握Java中的异常处理机制以及如何自定义异常类。通过比较学生对象和工人对象,若尝试对两者进行比较,则会触发异常,以此来学习...
java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类...
例如,你可以创建一个名为 `CustomServiceException` 的异常类,它可能包含特定的错误码和错误信息: ```java public class CustomServiceException extends RuntimeException { private int errorCode; ...
本篇将深入探讨C++中的异常类,以及如何抛出和捕获异常,以实现稳健的代码。 首先,C++的异常处理基于三个关键字:`try`、`catch` 和 `throw`。`try` 块用来包含可能抛出异常的代码,`catch` 块用于捕获并处理这些...
Java提供了丰富的异常类来表示不同类型的错误,其中就包括与时间相关的异常。本文将深入探讨Java中的时间异常类及其在处理时间问题时的重要性。 在Java中,时间处理主要涉及到`java.util.Date`、`java.time`包...
如果产生的异常类与所处理的异常类一致,则认为找到了合适的异常处理方法。 3. 处理异常:如果运行系统找遍了所有方法而没有找到合理的异常处理方法,则运行系统将终止 Java 程序的运行。 Java 异常类型可以分为...
在描述中提到的`bad_exception`是C++标准异常类的一个特殊成员,它在特定情况下被用来表示程序中出现了未预期的异常。 `exception`类是所有标准异常的基类,位于 `<exception>` 头文件中。这个类提供了几个关键的...
Java 异常类的层次结构是一个树形结构,其中 Throwable 是所有异常类的根类。它有两个子类:Exception 和 Error。Exception 是用户程序应当捕获的异常情况,而 Error 是内部错误,因此在正常情况下不期望用户的程序...
课后作业中的问题涉及到抽象类、接口、内部类的特点和区别,异常处理机制以及关键字`this`、`super`、`final`的用法,包机制,访问权限修饰符,接口实现与类继承的区别等Java基础知识。实践题要求设计实现接口、ATM...
`Exception`类是所有异常类的父类,它代表了可以通过程序捕获并处理的异常。根据是否可以被try-catch语句捕获,`Exception`又可以细分为两类: - **检查型异常**(Checked Exception):这些异常通常是由程序设计...
Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE...
10.2.1 异常类结构与组成:异常是运行时错误的对象,对应Java特有的异常处理机制。Java提供了许多异常类,每个类代表一种特定的运行错误。当发生错误时,系统会创建相应异常类的对象,这个对象需要被处理以避免程序...
1. **运行时异常**:这类异常在程序执行期间发生,通常由非法操作引起,如除以零、数组越界、空指针引用等。运行时异常需要立即处理,因为它们可能导致程序崩溃。 2. **逻辑错误**:逻辑错误是程序员在设计算法或...
java * 工具类异常 * 工具类异常 * 工具类异常 * 工具类异常java * 工具类异常 * 工具类异常 * 工具类异常 * 工具类异常java * 工具类异常 * 工具类异常 * 工具类异常 * 工具类异常java * 工具类异常 * 工具类异常 *...
Java中的常用类与异常处理是Java编程中至关重要的部分,这些概念构成了Java应用程序的基础和健壮性。在Java中,`Object`类是所有类的父类,它提供了几个核心的方法,包括`equals()`, `hashCode()`, 和 `toString()`...
Java面向对象程序设计第6章_内部类与异常类