异常的捕获及处理

作者:gqk:

  1、 异常的产生原因及处理格式

  2、 异常的标准使用方式

  3、 throw 和 throws 关键字的作用


认识异常:保证程序不会因出现异常而终止,必须对有可能出现异常的代码进行处理

 

现实生活中的异常:

  

处理异常:上班的途中遇到异常后,我们可定要对这些异常进行处理,两种方式,

  一:自己解决

  二:打电话让让别人解决

在 Java 中使用如下的语法进行异常的处理:

try{  
可能出现异常的语句 ;
 } catch(异常类型 异常对象){
  处理异常 ; 
} catch(异常类型 异常对象){
  处理异常 ;
 } ... finally{
  异常处理的统一出口 
; } 

 处理异常

package demo;

public class DemoExecption {
	public static void main(String[] args) {
		int num1 = 0;
		int num2 = 10;
		int result = 0;
		System.out.println("==============计算开始==============");
		try {
			 result = num2/num1;
		} catch (ArithmeticException  e) {
			System.out.println("异常信息为:"+e.getMessage());
		}
		System.out.println(result);
		System.out.println("==============计算结束==============");
	}
}

  这个时候由于程序中增加了异常的处理机制,所以,此时的程序可以正常的执行完毕,当然,在异常的处理中也可 以加入 finally作为统一的出口操作 

package demo;

public class DemoExecption {
	public static void main(String[] args) {
		int num1 = 0;
		int num2 = 10;
		int result = 0;
		System.out.println("==============计算开始==============");
		try {
			 result = num2/num1;
		} catch (ArithmeticException  e) {
			System.out.println("异常信息为:"+e.getMessage());
		}finally {
			System.out.println("不管有没有都会去执行");
		}
		System.out.println(result);
		System.out.println("==============计算结束==============");
	}
}

 但是以上的程序并不灵活,因为所有的操作的数字都是固定好的了,那么下面希望可以让这个数字由用户自己决定, 所以,通过初始化参数传递所需要计算的数字。

注意:考虑异常,第一个数学运算异常,第二个数组下标异常,第三个数字格式异常

考虑:如果异常有很多的话,我们不能确定应该怎么办:

异常的处理结构:

Error:表示jvm出错,还没有运行到程序上,所以一般不需要处理;

Execption:在程序中发生的异常,一般都应该进行处理

从之前学习过的对象多态性中可以发现,任何的子类对象都可以自动向父类对象转换。  那么,肯定所有的异常类的操作都可以通过 Exception 进行接收。

但是,如果一个 try 语句之中同时有多个 catch 的话一定要记住的是,捕获范围小的异常要放在捕获范围大的异常之 前,一般在开发中为了简单起见,大部分的异常都直接使用 Exception 接收即可。

异常的处理流程:

 在异常的处理中基本上都是采用如下的过程完成的:

1、 每当一个异常产生之后,实际上都会自动生成一个异常类的实例化对象,如果此时编写了异常处理语句的 话,则进行异常的处理,如果没有的话,则交给JVM 进行处理。

2、 使用了 try 捕获异常之后,将自动与 catch 中的异常类型相匹配,如果匹配成功,则表示可以使用此 catch 处理异常,如果都没有匹配成功的,则不能处理。   
3 、程序中不管是否出现了异常,如果存在了 finally语句,都要执行此语句的代码

throws 关键字:(抛出异常)

throws 关键字主要是用在方法的声明上,表示一个方法不处理异常,而交给被调用处进行处理。

案例:????

throws 关键字不光可以在普通的方法上使用,主方法上也可以使,如果在主方法上使用的话就表示一旦出现了异常之 后,继续向上抛,表示由JVM 进行处理了。

throw 关键字

throw 关键字是在程序中人为的抛出一个异常对象 

public class ExpDemo09 {  
public static void main(String args[]) {   
try{    
throw new Exception("抛着玩的!") ; }catch(Exception e){ e.printStackTrace() ; } } };

(自定义异常):

RuntimeException 和 Exception:

· public static int parseInt(String s) throws NumberFormatException  本方法中存在了 throws 关键字的声明,理论上讲,在调用时必须进行异常处理,但是从实际的使用中可以发现,即 使不使用 try…catch 处理也没问题。

package demo;

public class DemoExecption {
	public static void main(String[] args) {
		Integer.parseInt("10");
	}
}

 要想解释这个问题,必须观察 NumberFormatException 异常的继承结构:

 可以发现 NumberFormatException 是 RuntimeException 的子类,那么实际上在程序中,Java 为了异常的处理方便,定 义出了一个特殊的异常类 —— RuntimeException,一旦抛出的异常是此类或者是此类的子类的话,那么可以不用进行异 常处理的操作,如果不做任何异常处理的话,则一旦出现了异常之后将交给被调用处进行处理。 

RuntimeException 和 Exception 的区别,Exception 必须处理,而 RuntimeException 可以不用处理

异常处理的标准格式

 之前的异常的处理语句:try…catch…finally、throw、throws 实际上在开发中是要一起使用的,以下面的程序为例。

 编写一个除法的操作,要求在计算开始的时候输出“开始计算”的信息,在计算完成之后,输出“结束计算”的信 息,而且只要是出现了异常一定要交给被调用处处理。 

总结:

1、 异常的处理就是保证程序可以正常的执行完毕

2、 异常处理的标准格式及流程

3、 Exception 和 RuntimeException 的区别

 

考虑一下代码

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            i ++;
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
        }
}

  代码顺序执行从try到finally,由于finally是无论如何都会执行的,所以try里的语句并不会直接返回。在try语句的return块中,return返回的引用变量并不是try语句外定义的引用变量i,而是系统重新定义了一个局部引用i’,这个引用指向了引用i对应的值,也就是2,即使在finally语句中把引用i指向了值10,因为return返回的引用已经不是i,而是i',所以引用i的值和try语句中的返回值无关了

猜你喜欢

转载自www.cnblogs.com/520gqk/p/9646518.html