JAVA异常处理try...catch

 1.为什么要使用异常处理
   例外是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。为了加强程序的健壮性,程序设计时,必须考虑到可能发生的异常事件并做出相应的处理。
  当发生错误时,通过异常处理,使程序作出相应的处理,不至于导致系统崩溃,程序终止.
  当发生错误时,可以在短时间内找到错误所在行,方便程序的维护.
  下面举一个简单的例子,具体的看一下异常的好处:

class  TestNoException  {
    
public TestNoException() {
    }

    
public boolean test1() {
        
int d = 0;
        
int a = 42 / d;
        System.out.println(
"i want to print this line!");
        
return true;
    }

    
public static void main(String args[]) {
        TestNoException tst 
= new TestNoException();
        tst.test1();
    }

}

运行这个类的main函数看看,test1()函数的目的是打印出语句"i want to print this line!",但是程序发生异常,导致无法实现.
2.异常处理的框架

try   {
// block of code to monitor for errors
}

catch  (ExceptionType1 exOb)  {
// exception handler for ExceptionType1
}

...
// 可以抛出多个异常
catch  (ExceptionType2 exOb)  {
// exception handler for ExceptionType2
}

finally   {
// block of code to be executed before try block ends
}

以上是JAVA异常处理的通用框架,大部分的异常处理都可以使用该框架进行处理.


 使用finally块释放资源
    finally关键字保证无论程序使用任何方式离开try块,finally中的语句都会被执行。在以下三种情况下会进入finally块:
(1) try块中的代码正常执行完毕。
(2) 在try块中抛出异常。
(3) 在try块中执行return、break、continue。
因此,当你需要一个地方来执行在任何情况下都必须执行的代码时,就可以将这些
代码放入finally块中。当你的程序中使用了外界资源,如数据库连接,文件等,必须将释放这些资源的代码写入finally块中。
必须注意的是,在finally块中不能抛出异常。JAVA异常处理机制保证无论在任何情况下必须先执行finally块然后在离开try块,因此在try块中发生异常的时候,JAVA虚拟机先转到finally块执行finally块中的代码,finally块执行完毕后,再向外抛出异常。如果在finally块中抛出异常,try块捕捉的异常就不能抛出,外部捕捉到的异常就是finally块中的异常信息,而try块中发生的真正的异常堆栈信息则丢失了。
请看下面的代码:

Connection  con  =   null ;
try
{
    con 
= dataSource.getConnection();
    ……
}

catch (SQLException e)
{
    ……
    
throw e;//进行一些处理后再将数据库异常抛出给调用者处理
}

finally
{
    
try
    
{
        con.close();
    }

    
catch(SQLException e)
{
    e.printStackTrace();
    ……
}

}

运行程序后,调用者得到的信息如下
java.lang.NullPointerException
 at myPackage.MyClass.method1(methodl.java:266)
而不是我们期望得到的数据库异常。这是因为这里的con是null的关系,在finally语句中抛出了NullPointerException,在finally块中增加对con是否为null的判断可以避免产生这种情况。


出于省事的目的,很多人习惯于用一个庞大的try块包含所有可能产生异常的代码,
这样有两个坏处
阅读代码的时候,在try块冗长的代码中,不容易知道到底是哪些代码会抛出哪些异常,不利于代码维护。
使用try捕获异常是以程序执行效率为代价的,将不需要捕获异常的代码包含在try块中,影响了代码执行的效率。
Java 的java.lang 中定义的未检查异常子类
异常 说明
ArithmeticException 算术错误,如被0除
ArrayIndexOutOfBoundsException 数组下标出界
ArrayStoreException 数组元素赋值类型不兼容
ClassCastException 非法强制转换类型
IllegalArgumentException 调用方法的参数非法
IllegalMonitorStateException 非法监控操作,如等待一个未锁定线程
IllegalStateException 环境或应用状态不正确
IllegalThreadStateException 请求操作与当前线程状态不兼容
IndexOutOfBoundsException 某些类型索引越界
NullPointerException 非法使用空引用
NumberFormatException 字符串到数字格式非法转换
SecurityException 试图违反安全性
StringIndexOutOfBounds 试图在字符串边界之外索引
UnsupportedOperationException 遇到不支持的操作
java.lang 中定义的检查异常
异常 意义
ClassNotFoundException 找不到类
CloneNotSupportedException 试图克隆一个不能实现Cloneable接口的对象
IllegalAccessException 对一个类的访问被拒绝
InstantiationException 试图创建一个抽象类或者抽象接口的对象
InterruptedException 一个线程被另一个线程中断
NoSuchFieldException 请求的字段不存在
NoSuchMethodException 请求的方法不存在

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值