java-异常

来源:互联网 发布:全国地图软件下载 编辑:程序博客网 时间:2024/05/18 16:54

引言
在这里,介绍一下有关异常的概念
异常
异常:就是程序出现的不正常的情况。
异常:
(1)错误:这是非常严重的问题,一般我们处理
(2)异常:
a.编译时期异常 开始就必须要处理的,如果不处理,后面就走不了。
b.运行时期异常 开始可以不用处理。这种问题一旦发生,就是我们的程序问题,需要我们修改程序。
体系结构:
Throwable:
(1)Error:
(2)Exception:
a.非RuntimeException:非运行时期异常
b.RuntimeException:运行时期异常
遇到异常之后jvm虚拟机的默认的处理方式:
1.停止程序运行
2.将异常的位置,异常的包名和类名全部打印在控制台
3.并且给出错误的原因
在这里举一个异常出现情况:除数不能为0

package com.stu_01;//除数不能为0public class ExceptionStu01 {    public static void main(String[] args) {        int a=19;        int b=0;        System.out.println("出现异常");         System.out.println(a/b);    }}

编译运行后结果如下:
出现异常
Exception in thread “main” java.lang.ArithmeticException: / by zero
at com.stu_01.ExceptionStu01.main(ExceptionStu01.java:9)
从结果可以看到,当有异常情况的时候,会在控制台打印出异常的位置,类名和包名,上面的程序中异常就是如此显示
这种处理方案虽然可以,但是不够好。
其实程序出问题,不应该直接停止,因为我们的程序可能是由多部分组成的,其中一个部分出问题了,不应该影响其他部分的执行。所以,我们应该想办法让其他的部分能够执行下去。
那么我们应该如何处理异常,保证各个部分不影响的呢?
两种方案:
A:try…catch…finally
B:throws
try…catch…finally:
try{
可能出现异常的代码
}catch(异常类名 变量名) {
针对异常的代码处理
}finally {
释放资源的地方
}
我们简化一下第一个:
try{
可能出现异常的代码
}catch(异常类名 变量名) {
针对异常的代码处理
}
多个异常的处理
A:针对每一个出现问题的地方写一个try…catch语句
B:针对多个异常,采用一个try,多个catch的情况。
try…catch…catch…
遇到try里面的问题,就自动和catch里面进行匹配。
一旦匹配就执行catch里面的内容,执行完毕后,接着执行后面的代码。
注意:
(1)如果异常间有子父关系,父必须在最后。
(2)如果说代码中存在多个catch块,那么如果有一个catch块中的异常类是Exception,那么这个catch块必须放到最后,如果你放到最前面的话,所有的异常全部都会被Exception的处理逻辑所处理,后面的所有catch块将不再会被访问。
举一个简单的例子说明一下多个异常的情况:
数组索引越界异常,除数为0异常

package com.stu_01;public class ExceptionStu03 {    //数组索引越界异常,除数为0异常    public static void main(String[] args) {        int a=10;        int b=0;        int[] arr=new int[3];        // A:针对每一个出现问题的地方写一个try...catch语句        try{            System.out.println(a/b);        }catch(ArithmeticException e){            System.out.println("除数为0");        }        try{            System.out.println(arr[3]);        }catch(ArrayIndexOutOfBoundsException e){            System.out.println("数组越界");        }        // B:针对多个异常,采用一个try,多个catch的情况。/*      try{            System.out.println(a/b);            System.out.println(arr[3]);        }catch(ArrayIndexOutOfBoundsException e){            System.out.println("数组越界");        }catch(ArithmeticException e){            System.out.println("除数不能为零");        }catch(Exception e){            System.out.println("程序出现问题");        }*/    }}

编译运行结果如下:
除数为0
数组越界
针对于第二种情况而言,它的运行结果如下:
除数不能为零
编译时期异常和运行时期异常的区别:
编译时期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
FileNotFoundException(文件未找到异常)
运行时期异常:无需显示处理,也可以和编译时异常一样处理
ArithmeticException
Throwable中的方法:
printStackTrace():打印异常信息,程序从出问题的地方开始就会打印创建一个该异常对应的对象,
该对象直接调用打印方法
try…catch 是直接进行了处理。
throws则是把异常处理的事情交给了调用者。
throws用在方法上,声明方法有异常,交给调用者处理。但是呢,如果是编译时期异常,调用就必须处理。如果是运行时期异常,调用者可以处理,也可以不处理。
throws:
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用,号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能,并不一定会发生这些异常
异常处理:
try…catch…finally
finally:一般用于释放资源。在数据库操作或者IO流比较常见。
特点:
被finally控制的语句体一定会执行
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
finally相关的面试题:
final,finally的区别?
final:最终的意思。可以修饰类,方法,变量。
修饰类,类不能被继承
修饰方法,方法不能被重写
修饰变量,变量是常量
finally:
异常处理的一部分。被finally控制的代码一定会执行。
特殊情况:在执行到finally之前,jvm退出了。
注意:
A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
上述仅仅针对编译时期异常
与运行时期异常无关。
throw和throws的区别?
throws:
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw:
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常?

0 0