第8章知识点.docx

上传人:b****5 文档编号:4576344 上传时间:2022-12-06 格式:DOCX 页数:13 大小:213.71KB
下载 相关 举报
第8章知识点.docx_第1页
第1页 / 共13页
第8章知识点.docx_第2页
第2页 / 共13页
第8章知识点.docx_第3页
第3页 / 共13页
第8章知识点.docx_第4页
第4页 / 共13页
第8章知识点.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

第8章知识点.docx

《第8章知识点.docx》由会员分享,可在线阅读,更多相关《第8章知识点.docx(13页珍藏版)》请在冰豆网上搜索。

第8章知识点.docx

第8章知识点

知识点:

1、什么是异常。

异常是程序正常执行过程中出现的不正常的情况。

例如:

人在成长过程中,是个正常的执行过程,但成长过程中会经常生病,这就是异常。

为了避免这种不正常的情况,我们会采取一系列措施,比如:

从小锻炼身体,吃新鲜干净的食物,营养合理的搭配,以增强我们的体质。

提高抗病能力。

程序我们为了提高它运行时的健壮性,我们也得采用一些措施。

那么怎么提高程序的健壮性呢?

JAVA程序中我通过异常的捕获来增加程序的健壮性。

2、异常捕获的顺序是怎样的呢?

当一个异常发生或抛出。

那么正常的程序执行序列将被终止,程序将对异常进行处理,我们称之为抛出异常被捕获。

JAVA中通过使用try-catch语句把可能抛出异常的语句包起来。

例如:

前面讲到资源文件类Properties类在进行文件加载时,使用以下语句捕捉异常。

try{

Propertiespro=newProperties();

Pro.load(newFileInputStream(“c:

/abc.properties”));

}catch(IOExceptione){System.out.println(e);}

3、异常的类型是怎样的呢?

所有异常类的超类是Throwable。

在Throwable下有两个子类,一个是Error,另一个是Exception。

Error是错误,程序员无法控制,Exception是异常,程序员可以通过异常捕获加以控制。

例如:

电脑运行中中毒了,我们可以通过杀毒软件来处理,处理完了以后可以继续使用,这叫异常,我们可以控制。

但电脑出现了蓝屏或死机的时候,我们就不能进行任何操作了。

这就是错误,我们无法控制。

4、程序中异常是怎么发生的呢?

StringinputStr=JOptionPane.showInputDialog(null,“请输入年龄”);

intage=Integer.parseInt(inputStr);

以上代码要求用户输入年龄,年龄是个数字。

但通过showInputDialog得到的是个字符串。

所以我们需要Integer.parseInt(inputStr),将字符串转成数字。

这个时候,如果用户输入的不是一个数字型的字符串,而是一个非数字的字符串(如字母、符号),在进行Integer.parseInt(inputStr)转化是就会发生一个异常。

如果我们不对它作任何处理,程序就有可能因此终止掉。

5、怎样捕获一个异常呢。

a、把正常运行的代码放在try块里。

b、如果程序中出现了异常就把异常抛出在catch中,如果catch中能捕获抛出的异常。

那么就会进行处理。

处理的代码写在catch块中。

try程序块里面的语句是按顺序执行的语句

当try程序块里面的语句抛出一个异常的时候,程序的控制转向了相匹配的catch程序块,catch程序块里面的语句被执行。

当异常发生后,程序执行将忽略try程序块中剩余的语句,继续执行程序块后面的语句。

如果在try程序块中没有抛出异常,那么catch块将被忽略。

程序将继续执行try-catch下面的语句

 

例如:

try{

System.out.println(“开始”);//1

intx=4/0;//2

System.out.println(“执行”);//3

}catch(Exceptione){

System.out.println(“发生异常”);//4

}

System.out.println(“异常处理外部”);

这是发生异常的情况,在try块里顺序执行,先打出“开始”,没有异常继续执行,当执行到第2行时,因为0不能做除数,所以会发生一个算术异常。

这个时候就会跳过try块里剩下的语句转去执行catch块中的内容。

所以第3行就不能执行。

跳到catch块中执行第4句,打出“发生异常”。

执行完以后接着往下顺序执行。

打出第5行“异常处理外部”。

try{

System.out.println(“开始”);//1

intx=4/2;//2

System.out.println(“执行”);//3

}catch(Exceptione){

System.out.println(“发生异常”);//4

}

System.out.println(“异常处理外部”);

这是正常情况,在try块里顺序执行,先打出“开始”,没有异常继续执行,当执行到第2行时,得到x的值为2,不会有异常。

这个时候继续执行到第3行,打出“执行”。

因为在try块中没有任何异常,执行完以后接着往下顺序执行。

打出第5行“异常处理外部”。

 

在Throwable类中有两个方法,可以用于获取抛出异常的信息

getMessage

printStackTrace

 

6、抛出异常

在一个try-catch语句中,当有多个catch块的时候,它们被顺序检查

在检查过程中,注意异常的匹配关系是很重要的

当一个异常被抛出,与它相匹配的catch块被执行,其它的catch块,就被忽略掉不再执行

 

如果没有catch块匹配抛出的异常,那么系统会在堆栈中搜索,找到一个匹配的捕获方法。

如果仍然没有找到,那么系统将处理抛出异常

什么叫异常和catch块相匹配:

1、抛出的异常和捕捉的异常是同一个类

2、抛出的异常是捕捉异常的子类

3、多个catch块中如果捕捉的异常之间有继承关系那么不要把父类放在子类之前(这种做法也不被允许)

4、尽量不要偷懒使用具体异常类而不要使用Exception

 

例如:

try{

int[]a=newint[4];

System.out.println(a[6]);//1

inti=3/0;//2

}catch(java.lang.ArithmeticExceptione){//捕获第2行异常

System.out.println("算术错误");

}

catch(java.lang.ArrayIndexOutOfBoundsExceptione){//捕获第1行异常

System.out.println("数组下标越界");

}

不同的异常由不同的catch块进行捕获。

发生异常时由相应的catch块进行处理。

Catch块中怎么捕获异常?

try{

inti=3/0;

}catch(java.lang.ArithmeticExceptione){//抛出异常和捕获异常是同一个类

System.out.println("算术错误");

}

 

try{

inti=3/0;

}catch(java.lang.Exceptione){//抛出异常是捕获异常的子类

System.out.println("算术错误");

}

 

try{

int[]a=newint[4];

System.out.println(a[6]);

}catch(java.lang.Exceptione){

System.out.println("发生异常");

}

catch(java.lang.ArrayIndexOutOfBoundsExceptione){

System.out.println("数组下标越界");

}

这种方式不被允许,因为catch块前一个异常Exception是后一个异常ArrayIndexOutOfBoundsException的父类。

所以有异常前一个异常catch块都捕获了。

后一个catch块永远不会被执行。

编译会出错。

 

try{

int[]a=newint[4];

System.out.println(a[6]);

}catch(java.lang.ArrayIndexOutOfBoundsExceptione){

System.out.println("数组下标越界");

}

catch(java.lang.Exceptione){

System.out.println("发生异常");

}

这种方式允许。

如果有数组下标越界异常由第一个catch块处理。

如果有其它异常由第二个catch块处理。

 

7、如果有一块代码不管是否发生异常抛出都要被执行,我们使用关键字finally

这样的机制有助于我们进行系统资源的回收。

比如:

在数据库操作时,如果发生了异常,那么数据库连接就可能不会关闭,而一直长驻内存。

在进行IO文件读取和写入时,如果发生了异常就可能流不会关闭。

所以使用finally可以解决这样的问题。

Try{

……

}catch(){

……

}

finally{

……

}

这样的结构可以用警察抓小偷来说明,警察抓小偷,如果小偷守法(没有异常)则警察就不会抓他,如果小偷违法(发生异常),则警察就抓它往监狱里放(catch代码块)。

不管抓没有抓到,警察工资照拿。

(finally内容)

publicvoidchange(){

try{

intx=9/3;

System.out.println(“正常执行”);

}catch(Exceptione)

{

System.out.println("发生异常");

}

finally{

System.out.println("finally内容");

}

}

因为正常执行,所以catch里内容不会执行。

执行结果是“正常执行”和“finally内容”

 

publicvoidchange(){

try{

intx=9/0;

System.out.println(“正常执行”);

}catch(Exceptione)

{

System.out.println("发生异常");

}

finally{

System.out.println("finally内容");

}

}

因为发生异常,所以catch里内容执行。

执行结果是“发生异常”和“finally内容”

 

8、关于finally的问题

大家都知道return是跳出方法的语句,如果在try里有return语句那么finally里的内容会不会执行呢?

答案是会的。

会在return语句之前执行,执行完finally语句之后,return语句再执行。

 

publicvoidchange(){

try{

intx=9/0;//1

return;

}catch(Exceptione)

{

System.out.println("发生异常");

}

finally{

System.out.println("finally内容");

}

System.out.println("异常外部内容");

}

该代码发生了异常。

所以第一行代码以下语句会被忽略,所以return语句不会执行。

该代码执行结果为“发生异常”、“finally内容”、“异常外部内容”

 

publicvoidchange(){

try{

intx=9/4;

System.out.println("正常执行");

return;

}catch(Exceptione)

{

System.out.println("发生异常");

}

finally{

System.out.println("finally内容");

}

System.out.println("异常外部内容");

}

该代码没有发生异常。

顺序执行。

先打“正常执行”,遇到return语句后,在返回前,先执行“finally内容”再做返回。

因为方法已经跳出,所以“异常外部内容”不会执行。

 

finally在任何时候都会执行,但有一个例外那就是程序终止时,不会执行。

publicvoidchange(){

try{

intx=9/4;

System.out.println(“正常执行”);

System.exit(0);

}catch(Exceptione)

{

System.out.println("发生异常");

}

finally{

System.out.println("finally内容");

}

System.out.println("异常外部内容");

}

因为没有异常,所以“正常执行”会打出来,但这个时候程序终止运行。

所以finally内容不会打出来。

 

9、关于异常对象

异常也是一个对象。

它是Exception类或子类的一个对象

publicvoidchange(){

try{

intx=9/0;//1

}catch(Exceptione)//2

{

System.out.println("发生异常");

}

}

在执行到第1行时,发生了异常。

这时候会产生一个和异常相匹配的异常对象。

然后在第2行时,用一个Exceptione的一个变量去指向它。

这个时候,如果人为的抛出一个异常也可以达到相同的效果。

这就是throw语句。

将显示的产生一个异常对象,并做抛出。

语法如下:

throw异常对象(thrownewException())。

 

10、传播异常

一个方法可以抛出异常,这样的话,在方法里我们就不用去捕获方法里可能发生的相关异常。

那么谁去处理这个异常呢?

由调用该方法的代码块去处理。

那么怎么样在方法里抛出异常呢?

我们需要修改方法的声明头,声明方法传播的异常类型

我们使用关键字throws来完成这个声明

例:

voidc()throwsException{

...

}

voidd()throwsException{

...

}

在d()方法中抛出了Exception异常,但在方法体里却可以不产生异常对象。

就象要开枪先瞄准,但瞄准后可以不开枪。

11、异常的类型

异常会为编译期异常和运行期异常。

(或检查异常和非检查异常)其中运行期异常是RuntionException类和它的子类。

除此之外都是编译期异常。

编译期异常是我们必须要捕获的,而运行期异常却可以捕获,也可以不捕获。

就象警察一样,大案和要案是必须要立案侦破的,而小偷小摸的毛贼,可以抓也可以不抓。

 

编译异常我们必须要处理,要么用try-catch包围,要么做方法抛出。

 

如果一个方法抛出编译期异常,那么调用该方法时,必须处理,如果抛出运行期异常,那么调用该方法时,可处理可不处理。

 

voidC()throwsException{

...

}

voida(){

try{

c();

}catch(Exceptione){System.out.println(“异常”);}

}

 

publicclassTException{

publicstaticvoidmain(String[]args){

TExceptionte=newTException();

te.throwException();//1

te.throwAException();//2

te.throwCException();//3

te.throwDException();//4

}

publicvoidthrowAException()throwsThrowable{}

publicvoidthrowCExcetion()throwsException{}

publicvoidthrowException()throwsMyException{}

publicvoidthrowDException()throwsMyCException{}

}

classMyCExceptionextendsException

{

publicMyCException(){}

publicMyCException(Stringmsg){

super(msg);

}

}

classMyExceptionextendsRuntimeException{

publicMyException(){

}

publicMyException(Stringmsg){

super(msg);

}

}

代码分析:

在main方法里分别调用了四个方法。

其中第1行代码调用throwException方法。

该方法抛出MyException异常。

而MyException是RuntimeException的子类,所以可以不处理。

不会发生编译错误。

第2行代码调用throwAException方法,该方法抛出Throwable。

这是所有异常和错误的超类,包含编译期异常,所以必须处理。

直接写的话,编译会出错。

第3行调用throwCException方法,该方法抛出Exception异常,包括编译异常,所以也必须捕获。

第4行调用throwDException方法,该方法抛出MyCException异常,而MyCException是Exception的子类,所以也必须捕获。

 

12、断言

Java中新的断言机制只有在Java2SDK1.4及以上版本可用

当你在编译和运行带有断言的Java程序的时候,请确定使用正确的JDK版本

在方法里先断定某个条件为真,如果条件满足,则执行方法,否则抛出一个错误(AssertionError)。

断言语句的标准语法如下

assert<布尔表达式>;

断言语句也可以像下面的这个语法形式:

assert<布尔表达式>:

<表达式>;

 

在<表达式>的这个位置,描述了一个传递给AssertionError类构造方法的参数值。

这个参数值用以描述抛出错误的详细信息

 

在Java2SDK1.4以前的版本中,assert是一个合法的非保留字的标示符。

而在Java2SDK1.4或以上版本中,为了保证兼容性,assert被当作了规则标示符对待,

即被当做了一个保留字

使用断言时,必须打开断言开关。

具体语法如下:

javac–source1.4<源文件>

java–ea<主类名>

断言分类:

前置断言:

检测一个方法执行之前,检测条件必须为true.

后置断言:

检测一个方法执行之后,检测条件必须为true.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1