Java基础17-异常的注意事项

本文深入探讨Java异常处理机制,涵盖多个catch块的应用、finally语句的作用、异常对象的使用及常见异常类型。从算数异常到数据库异常,全面解析如何有效管理和捕获异常。

1.多个catch块

当我们对一段代码进行异常处理的时候会发现,有可能出现很多不同类型的异常,单靠一个异常处理不能解决问题

所以我们需要提供多个catch语句块分别对异常进行处理:

例如:
import java.io.IOException;
public class ExceptionTryCatchTest {
    public void doSomething() throws IOException{
        System.out.println("do somthing");
    }
    public static void main(String[] args){
        ExceptionTryCatchTest etct = new ExceptionTryCatchTest();
        try {
            etct.doSomething();
        } catch (Exception e) {

        } catch (IOException e) {

        }
    }

}

2.finally语句:

使用finally语句块可以保证不论try语句块中是否出现异常,finally语句块中的代码都会被执行。

例如:

3.异常使用注意事项

(1)异常的捕获顺序;在前面介绍了异常捕获时提过,catch语句后的异常类型必须是与try语句块中抛出的异常的类型一致,

或者是抛出异常类型的父类,catch语句块中的代码才会被执行。如果try语句块中抛出一个异常,而多个catch语句后声明捕获

的异常类型,分别是这个抛出的异常类型和这个抛出的异常类型的父类(包括父类的父类),则这些catch语句都能捕获并处理这个异常,程序如何运行?

例如:

public class Text{

public static void main(String[] args)

{

try{

String teacher[]={"柳海龙","孙传杰","孙悦"};

for(int i=0;i<4;i++){

System.out.print(teacher[i]);
}

}catch(RuntimeException e){

System.out.print(""发生运行时异常,成功捕获!);

}catch(ArrayIndexOutOfBoundsException e){

System.out.print("发生数组下标越界异常,成功捕获!");

}catch(Exception e){

System.out.print("发生异常,成功捕获!");

}finally{

System.out.print("显示完毕!");

}

}

}

输出结果:

柳海龙

孙传杰

孙悦

发生数组下标越界异常,成功捕获!

显示完毕!

捕获顺序“从小到大”:即,先查子类然后查其父类,避免了父类大的异常捕获了,导致对子类的小异常无法进行捕获的情况。

4.异常对象

针对捕获的不同类型的异常,都获取了该异常的对象。即,catch(异常类型 变量名)语句括号里右边的变量名为异常类对象名

常用的异常对象的方法有两个:一个是:printStackTrace(),用于输出异常的堆栈信息,其中堆栈信息包括程序运行到当前类的

执行流程,显示方法调用序列;另一个方法是:getMassage(),用于返回异常详细信息的字符串。

例如:

public class Text{

public static void main(String[] args)

{

try{

String teacher[]={"柳海龙","孙传杰","孙悦"};

for(int i=0;i<4;i++){

System.out.print(teacher[i]);

}catch(ArrayIndexOutOfBoundsException e){
Syste.out.print("调用异常对象getMassage()方法:")
System.out.print(e.getMassage());
System.out.print("调用异常对象的printStackTrace()方法");
e.printStrackTrace();
}finally{
System.out.print("显示完毕!");

}

}

}

结果:

柳海龙

孙传杰

孙悦

调用异常对象的getMassage()方法:

3

调用异常对象的printStackTrace()方法:

java.lang.ArrayIndexOutOfBoundsException:3

            at Test.main<Test.java:8>

显示完毕!

5.常见的异常

   1.ArithmeticException 算数异常--如最常见的除数为0
   
    2.ArrayindexOutOfBoundsException 数组下标越界异常,但需要遍历数组时,用foreach或者ArraryList可避免此异常。
   
    3.ClassCastException 强制转换异常
   
    4.ClassNotFoundException 找不到指定类异常,此类异常常发生于以下几种情况,
                                          如:Class类中的forName方法
                                               ClassLoader类中的findSystemClass方法
                                               ClassLoader类中的loadClass方法
                               
    5.NullPointException 空指针异常,当应用程序试图在需要对象的地方使用null时,抛出此异常:
                                  如:调用null对象的实例方法
                                       访问或修改null对象的字段
                                       将null作为一个数组,获得其长度
                                       将null作为一个数组,访问或修改其元素值
                                       将null作为Throwable值抛出
                                  要避免此类异常可在定义引用类型变量就对其初始化,或者在使用此变量进行是否为空判断。
   
    6.ArrayStoreException 数组存值异常--即元素类型不一致时抛出此异常,但若数组引用类型为Object则不会抛出此异常。
 

 
三、其他常见异常
   
   1.IllegalAccessExcetion 非法访问异常--是当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,
                                       或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时
                                       抛出的异常。
                                       此异常最常见是在有安全管理器下使用反射设置私有域的值。此时必须要使用setAccessible()修改
                                       其可见性。一般而言,尽量避免使用反射来访问私有域。
                       
    2.FileNotFoundException 文件未发现异常--在试图打开指定路径名表示的文件失败时抛出的异常。在不存在具有指定路径
                                     名的文件时,该异常有FileInputStream、FileOutputStream和ReadomAccessFile构造方法抛出。
                                     若此文件存在,却由于其他原因不可访问,将抛出此异常。如打开一个只读文件进行写入。
                                     要避免此类异常,可先通过File类的exists()方法来判断此文件是否存在。也可使用文件选择器,把
                                     可操作的文件均罗列出来。
   
    3.SqlException 数据库异常--提供关于数据库访问错误或其他错误信息的异常。通过此异常可知道:
                        a.描述错误的字符串;
                        b."SQLstate"字符串,该字符串遵守XOPEN SSQLstate约定或SQL:2003约定
                        c.特定于每个供应商的整数错误代码。
                        d.到下一个Exception的链接
                        e.因果

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值