异常的捕获及处理
Posted 520gqk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常的捕获及处理相关的知识,希望对你有一定的参考价值。
作者: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语句中的返回值无关了
以上是关于异常的捕获及处理的主要内容,如果未能解决你的问题,请参考以下文章