异常:异常是程序正常执行过程中出现的不正常的情况。
异常捕获的顺序是怎样的呢?当一个异常发生或抛出。 那么正常的程序执行序列将被终
止,程序将对异常进行处理,我们称之为抛出异常被捕获。 JAVA 中通过使用 try-catch 语句把可能抛出异常的语句包起来。
怎样捕获一个异常呢。
a、 把正常运行的代码放在 try 块里。
b、 如果程序中出现了异常就把异常抛出在 catch 中,如果 catch中能捕获抛出的异常。
那么就会进行处理。处理的代码写在 catch 块中。
try 程序块里面的语句是按顺序执行的语句知识点:1、 什么是异常。异常是程序正常执行过程中出现的不正常的情况。例如: 人在成长过程中,是个正常的执行过程,但成长过程中会经常生病,这就是异常。为了避免这种不正 常的情况,我们会采取一系列措施,比如:从小锻炼身体,吃新鲜干净的食物,营养合 理的搭配,以增强我们的体质。提高抗病能力。程序我们为了提高它运行时的健壮性, 我们也得采用一些措施。那么怎么提高程序的健壮性呢? JAVA 程序中我通过异常的捕 获来增加程序的健壮性。2、 异常捕获的顺序是怎样的呢?当一个异常发生或抛出。 那么正常的程序执行序列将被终止,程序将对异常进行处理,我们称之为抛出异常被捕获。 JAVA 中通过使用 try-catch 语句把可能抛出异常的语句包起来。例如:前面讲到资源文件类 Properties 类在进行文 件加载时,使用以下语句捕捉异常。try{Properties pro=new Properties();Pro.load(new FileInputStream( “c:/abc.properties ”));}catch(IOException e){System.out.println(e);}3、 异常的类型是怎样的呢?
所有异常类的超类是 Throwable 。在 Throwable 下有两个子类,一个是 Error ,另一个是 Exception 。 Error 是错误,程序员无法控制, Exception 是异常,程序员可以通过异常捕获加 以控制。例如: 电脑运行中中毒了, 我们可以通过杀毒软件来处理,处理完了以后可以继续 使用, 这叫异常,我们可以控制。但电脑出现了蓝屏或死机的时候,我们就不能进行任何操 作了。这就是错误,我们无法控制。4、 程序中异常是怎么发生的呢?
请输入“年龄 ” );
showInputDialog 得到的是个字符串。
String inputStr = JOptionPane.showInputDialog(null, int age = Integer.parseInt(inputStr); 以上代码要求用户输入年龄,年龄是个数字。但通过
所以我们需要 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( int x=4/0;//2开始 ”);//1System.out.println(}catch(Exception e){System.out.println(}System.out.println( 这是发生异常的情况,在执行 ”);//3发生异常 ”);//4异常处理外部 ”);try 块里顺序执行,先打出“开始” ,没有异常继续执行,当 执行到第 2行时,因为 0 不能做除数,所以会发生一个算术异常。这个时候就会跳过 try 块 里剩下的语句转去执行 catch 块中的内容。 所以第 3行就不能执行。 跳到 catch 块中执行第 4
句,打出“发生异常” 。执行完以后接着往下顺序执行。打出第 5 行“异常处理外部” 。try{System.out.println( “开始 ”);//1int x=4/2;//2System.out.println( “执行 ”);//3}catch(Exception e){System.out.println( “发生异常 ”);//4}System.out.println( “异常处理外部 ”);这是正常情况,在 try 块里顺序执行,先打出“开始” ,没有异常继续执行,当执行到 第 2 行时,得到 x 的值为 2 ,不会有异常。这个时候继续执行到第 3 行,打出“执行” 。因为在 try 块中没有任何异常,执行完以后接着往下顺序执行。打出第 5 行“异常处理外部” 。在 Throwable 类中有两个方法,可以用于获取抛出异常的信息getMessageprintStackTrace6、 抛出异常 在一个 try-catch 语句中,当有多个 catch 块的时候,它们被顺序检查在检查过程中,注意异常的匹配关系是很重要的当一个异常被抛出, 与它相匹配的 catch块被执行, 其它的 catch 块,就被忽略掉不再执 行如果没有 catch 块匹配抛出的异常,那么系统会在堆栈中搜索,找到一个匹配的捕获方 法。如果仍然没有找到,那么系统将处理抛出异常什么叫异常和 catch 块相匹配:1、抛出的异常和捕捉的异常是同一个类2、抛出的异常是捕捉异常的子类3、多个 catch 块中 如果捕捉的异常之间有继承关系 那么不要把父类放在子类之 前(这种做法也不被允许)4、尽量不要偷懒 使用具体异常类而不要使用 Exception例如 :try {int [] a= new int [4] ;System. out .println(a[6]);//1int i=3/0;//2
} catch (java.lang.ArithmeticException e){// 捕获第 2行异常System. out .println( "算术错误 ");}catch (java.lang.ArrayIndexOutOfBoundsException e){ // 捕获第 1行异常System. out .println( "数组下标越界 ");}不同的异常由不同的 catch 块进行捕获。发生异常时由相应的 catch 块进行处理。Catch 块中怎么捕获异常?try{int i=3/0;}catch(java.lang.ArithmeticException e){// 抛出异常和捕获异常是同一个类 System.out.println(" 算术错误 ");}try{ int i=3/0;}catch(java.lang.Exception e){// 抛出异常是捕获异常的子类 System.out.println(" 算术错误 ");try {int [] a= new int [4] ;System. out .println(a[6]);} catch (java.lang. Exception e){System. out .println( "发生异常 ");}catch (java.lang.ArrayIndexOutOfBoundsException e){System. out .println( "数组下标越界 ");}这种方 式不被 允许,因为 catch 块前一个异常 Exception 是后一 个异常 ArrayIndexOutOfBoundsException 的父类。所以有异常前一个异常 catch 块都捕 获了。后一个 catch 块永远不会被执行。编译会出错。try {int [] a= new int [4] ;System. out .println(a[6]);
} catch (java.lang.ArrayIndexOutOfBoundsException e){System. out .println( "数组下标越界 ");}catch (java.lang.Exception e){ System. out .println( "发生异常 ");}这种方式允许。如果有数组下标越界异常由第一个 catch 块处理。如果有其它异常 由第二个 catch 块处理。7、如果有一块代码不管是否发生异常抛出都要被执行,我们使用关键字 finally 这样的机 制有助于我们进行系统资源的回收。比如:在数据库操作时,如果发生了异常,那么数 据库连接就可能不会关闭,而一直长驻内存。在进行 IO 文件读取和写入时,如果发生 了异常就可能流不会关闭。所以使用 finally 可以解决这样的问题。Try{}catch(){}finally{
这样的结构可以用警察抓小偷来说明,警察抓小偷,如果小偷守法(没有异常)则警察 就不会抓他,如果小偷违法(发生异常) 不管抓没有抓到,警察工资照拿。
finally 内容”
因为发生异常,所以 catch 里内容执行。执行结果是“发生异常”和“8、 关于 finally 的问题 大家都知道 return 是跳出方法的语句, 如果在 try 里有 return 语句那么 finally 里的 内容会不会执行呢?答案是会的。会在 return 语句之前执行,执行完 finally 语句之后, return 语句再执行。public void change(){try {int x=9/0;//1 return;} catch (Exception e){System. out .println( "发生异常 ");}finally {System. out .println( "finally 内容 ");}System. out .println( " 异常外部内容 " );}该代码发生了异常。 所以第一行代码以下语句会被忽略, 所以 return 语句不会执行 该代码执行结果为“发生异常”、“ finally 内容”、“异常外部内容”public void change(){ try {int x=9/4;System. out .println( "正常执行 "); return;} catch (Exception e){System. out .println( "发生异常 ");}finally {System. out .println( "finally 内容 ");}System. out .println( " 异常外部内容 " );该代码没有发生异常。顺序执行。先打“正常执行”,遇到 return 语句后,在返回 前,先执行“ finally 内容”再做返回。因为方法已经跳出,所以“异常外部内容” 不会执行。
finally 在任何时候都会执行,但有一个例外那就是程序终止时,不会执行 public void change(){try {
“正常执行 ”);"发生异常 ");"finally 内容 ");" 异常外部内容 " );
int x=9/4;System.out.println(System.exit(0);} catch (Exception e){System. out .println( } finally {System. out .println( }System. out .println(因为没有异常, 所以“正常执行” 会打出来, 但这个时候程序终止运行。 所以 finally 内容不会打出来。9、关于异常对象异常也是一个对象。它是 Exception 类或子类的一个对象public void change(){try {int x=9/0;//1} catch (Exception e)//2{System. out .println( "发生异常 ");}}在执行到第 1 行时,发生了异常。这时候会产生一个和异常相匹配的异常对象。然 后在第 2 行时,用一个 Exception e 的一个变量去指向它。这个时候,如果人为的抛出一个异常也可以达到相同的效果。这就是 throw 语句。将显示的产生一个异常对象,并做抛出。语法如下:throw 异常对象 (throw new Exception()) 。
10、传播异常 一个方法可以抛出异常,这样的话,在方法里我们就不用去捕获方法里可能发生的相关 异常。那么谁去处理这个异常呢?由调用该方法的代码块去处理。那么怎么样在方法里 抛出异常呢?我们需要修改方法的声明头,声明方法传播的异常类型我们使用关键字 throws 来完成这个声明例: void c( ) throws Exception {}void d( ) throws Exception {}在 d() 方法中抛出了 Exception 异常,但在方法体里却可以不产生异常对象。就象要开枪 先瞄准,但瞄准后可以不开枪。11、异常的类型异常会为编译期异常和运行期异常。 (或检查异常和非检查异常)其中运行期异常是 RuntionException 类和它的子类。除此之外都是编译期异常。编译期异常是我们必须要捕获的,而运行期异常却可以捕获,也可以不捕获。就象警察 一样,大案和要案是必须要立案侦破的,而小偷小摸的毛贼,可以抓也可以不抓。编译异常我们必须要处理,要么用 try-catch 包围,要么做方法抛出。如果一个方法抛出编译期异常,那么调用该方法时,必须处理,如果抛出运行期异常, 那么调用该方法时,可处理可不处理。void C( ) throws Exception {}void a(){try{ c();}catch(Exception e){System.out.println( “异常 ”);}
public class TException{public static void main(String[] args){TException te = new TException();te.throwException();//1te.throwAException();//2te.throwCException();//3te.throwDException();//4}public void throwAException() throws Throwable{}public void throwCExcetion() throws Exception{}public void throwException() throws MyException{}public void throwDException() throws MyCException{}}class MyCException extends Exception{public MyCException(){}public MyCException(String msg){super(msg);}}class MyException extends RuntimeException{public MyException(){}public MyException(String msg){super(msg);}}代码分析:在 main 方法里分别调用了四个方法。其中第 1 行代码调用 throwException 方法。该方 法抛出 MyException 异常。而 MyException 是 RuntimeException 的子类,所以可以不处 理。不会发生编译错误。 第 2行代码调用 throwAException 方法,该方法抛出 Throwable 。 这是所有异常和错误的超类,包含编译期异常,所以必须处理。直接写的话,编译会出 错。怎样捕获一个异常呢。
a、 把正常运行的代码放在 try 块里。
b、 如果程序中出现了异常就把异常抛出在 catch 中,如果 catch中能捕获抛出的异常。
那么就会进行处理。处理的代码写在 catch 块中。
try 程序块里面的语句是按顺序执行的语句当 try 程序块里面的语句抛出一个异常的时候,程序的控制转向了相匹配的 catch 程序块, catch 程序块里面的语句被执行。当异常发生后, 程序执行将忽略 try 程序块中剩余的语句, 继续执行程序块后面的语句。如果在 面的语句
try 程序块中没有抛出异常,那么 catch 块将被忽略。程序将继续执行 try-catch