详述异常处理方式及try-catch-finally的使用

接上篇博客:详述异常


出现异常时根据实际情况往往有三种处理办法可供选择。包含:JVM自动处理、主动捕获(try-catch)解决以及主动抛出(throw)处理。

一、JVM自动处理异常

当程序出现运行时异常时,如果不主动对其做任何处理,则异常会最终在被JVM执行时处理。

JVM处理方式为:立刻终止程序运行,同级代码不再执行,同时将异常信息、类型以及出错位置打印在控制台。

例如

public class Test {
	
    public static void main(String[] args) {
    	int [] array = {1,2,3,4,5};
    	System.out.println(array[20]);
    }
}

控制台显示运行结果如下:

二、主动捕获处理

我们发现程序中某一语句发生异常或者可能发生异常时可选择使用try-catch(finally)语句主动捕获并处理异常,程序不中断,异常语句下代码可正常执行。

1、使用try-catch

语法格式:

try {
    可能出现异常的语句
}catch(异常类型 变量名) {
    处理异常的方法
}

例如

public class Test {
	
    public static void main(String[] args) {
        try {
    	        System.out.println(1/0);//已知运行时会出现异常
    	}catch (ArithmeticException e) {//异常类型为数学运算型异常
    	    System.out.println("分母不能为0");
    	    e.printStackTrace();//异常处理方法为打印异常信息并且输出“分母不能为0”
    	}
    }
}

运行结果如下:

另外:try后可跟多个catch(类似于if 、else if),运行时根据判断异常类型来确定使用哪一种处理异常的方法

例如

public class Test {
	
    public static void main(String[] args) {
        try {
    	        System.out.println(1/0);
    	}catch (NullPointerException e){
            System.out.println("字符串不能为空");//处理方法1
            e.printStackTrace();
        }catch (ArithmeticException e) {
       	    System.out.println("分母不能为0");//处理方法2
    	    e.printStackTrace();
    	}catch (Exception e){//只能放在序列最后
            System.out.println("其它异常类型");//处理方法3
            e.printStackTrace();
        }
    }
}

上面代码中,输出“1/0”属于数学运算类型异常,而不属于空指针类型异常,根据判断,程序执行了异常处理方法2。

注意:

  • Exception是所有(狭义,不包括Error类)异常类的父类,因此任何异常都能满足Exception类型catch的判断条件
  • 当判断异常属于哪种类型后,剩下所有catch不再进行执行判断,直接跳过
  • 异常类型为Exception的catch语句只能放在所有catch语句序列中的最后一个

2、使用try-finally

语法格式:

try {
    可能出现异常的语句
}finally {
    处理异常的方法
}

注意:无论try中包含语句是否存在异常,finally包含的语句都会执行(一般用于释放资源)。

例如

public class Test {
	
    public static void main(String[] args) {
        try {
    	        System.out.println(1/1);//不存在异常
    	}finally {
    	    System.out.println("finally语句一定执行");
    	}
    }
}

运行结果为:

三、主动抛出处理

 发现异常时,可以不用try-catch而使用throws将异常类直接抛出,交给其它语句处理。

例如

public class Test throws Exception{
	
    public static void main(String[] args) {
        System.out.println(1/0);
    }
}

由于抛出处理较为复杂

关于主动抛出处理异常有关throw与throws具体使用方法可以参考我的另一篇博客:详述throw与throws

你可能感兴趣的:(Java入门)