java 异常处理 finally_Java语言之异常处理机制 try-catch-finally

一、在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有错,并且提供修改方法。很多情况下,当我们调用某个方法时,会提示我们某条语句应该用 try-catch语句来包起来。 但是一直没有去理解这是为什么!!! 举例说明如下:

ExceptionDemo.java

[java] view plain copy

1. package com.package2;

2.

3. class Demo

4. {

5.     int div(int a,int b)throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。

6.     {

7.         return a/b;

8.     }

9. }

10.

11.

12. public class  ExceptionDemo

13. {

14.     public static void main(String[] args)

15.     {

16.         Demo d = new Demo();

17.         try

18.         {

19.             int x = d.div(4,0);

20.             System.out.println("x="+x);

21.         }

22.         catch (Exception e)//Exception e = new ArithmeticException();

23.         {

24.             System.out.println("除零啦");

25.             System.out.println(e.getMessage());//  / by zero;

26.             System.out.println(e.toString());// 异常名称 : 异常信息。

27.

28.             e.printStackTrace();//异常名称,异常信息,异常出现的位置。

29.                             //其实jvm默认的异常处理机制,就是在调用printStackTrace方法。

30.                             //打印异常的堆栈的跟踪信息。

31.

32.

33.         }

34.

35.

36.         System.out.println("over");

37.

38.     }

39. }

为什么会出现提示呢?原因就在于被调用的方法throws了异常,即声明本函数可能会出现异常。

int div(int a,int b) throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。

{

return a/b;

}

此处抛出了异常,即任何调用此函数的地方都得准备随时捕获并且处理异常。

二、异常:就是程序在运行时出现不正常情况。

异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。

其实就是java对不正常情况进行描述后的对象体现。

对于问题的划分:两种:一种是严重的问题,一种非严重的问题。

对于严重的,java通过Error类进行描述。

对于Error一般不编写针对性的代码对其进行处理。

对与非严重的,java通过Exception类进行描述。

对于Exception可以使用针对性的处理方式进行处理。

无论Error或者Exception都具有一些共性内容。

比如:不正常情况的信息,引发原因等。

Throwable

|--Error

|--Exception

任何一个异常或者错误都继承于Throwable类,在Error和Exception下边分别各有N多种子类。

异常的处理:

(1)、java 提供了特有的语句进行处理。

try

{

需要被检测的代码;

}

catch(异常类 变量)

{

处理异常的代码;(处理方式)

}

finally

{

一定会执行的语句;

}

其中,当try中的语句产生异常时,会抛出一个异常对象,并且赋值给语句catch(异常类 变量)中的此变量。

由于出现异常被捕获之后,程序将不再执行出现异常下边的代码,而直接跳转到try-catch-finally语句块的下边开始执行。所以,在finall{ }语句块中执行的代码一般为释放程序资源,如关闭打开的文件等。

其中,try-catch-finally块中,finally块在以下几种情况将不会执行。

(1)finally块中发生了异常。

(2)程序所在线程死亡。

(3)在前面的代码中用了System.exit();    (ps这条是经常出现的)

(4)关闭了CPU

(2)、其中catch语句用于捕获并且处理异常,常见的处理机制有:getMessage()   toString()  以及printStackTrace()方法

举例如下:

上边代码,运行后如下:

e585e0d6f7f7c003c2e24325ae0e259b.png

由于进行了异常处理,所以程序执行完毕,“over”被打印出来。如果不加异常处理,JVM会报错,程序会停止执行。由上图可以看出默认的异常处理机制是调用e.printStackTrace()方法,并且终止程序的执行。

三、对多异常的处理。

(1)、声明异常时,建议声明更为具体的异常。这样处理的可以更具体。

(2)、对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。

如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

举例如下:

[java] view plain copy

1. package com.package2;

2.

3. class Demo

4. {

5.     int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throws的关键字声明了该功能有可能会出现问题。

6.     {

7.

8.         int[] arr = new int[a];

9.

10.         System.out.println(arr[4]);

11.

12.         return a/b;

13.     }

14. }

15.

16.

17. class  ExceptionDemo

18. {

19.     public static void main(String[] args)

20.     {

21.         Demo d = new Demo();

22.         try

23.         {

24.             int x = d.div(4,0);

25.             System.out.println("x="+x);

26.         }

27.         catch (ArithmeticException e)

28.         {

29.             System.out.println(e.toString());

30.             System.out.println("被零除了!!");

31.

32.         }

33.         catch (ArrayIndexOutOfBoundsException e)

34.         {

35.             System.out.println(e.toString());

36.             System.out.println("角标越界啦!!");

37.         }

38.         catch(Exception e)

39.         {

40.             System.out.println("hahah:"+e.toString());

41.         }

42.

43.

44.

45.         System.out.println("over");

46.

47.     }

48. }

当传入a=4,b=1时,运行结果如下所示:

78e62f1e4dee89289544fd72a587eaaa.png

当传入a=5,b=0时,运行结果如下所示:

ff0fc8e9b9d8ec53e1f6955bb8b34b76.png

四、自定义异常:

因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对于这些特有的问题可以按照java的对问题封装的思想。将特有的问题。进行自定义的异常装。

举例说明如下:

需求:在本程序中,对于除数是-1,也视为是错误的是无法进行运算的。那么就需要对这个问题进行自定义的描述。

当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。要么在内部try catch处理。要么在函数上声明让调用者处理。

一般情况在,函数内出现异常,函数上需要声明,此时会发现打印的结果中只有异常的名称,却没有异常的信息。因为自定义的异常并未定义信息。

如何定义异常信息呢?

因为父类中已经把异常信息的操作都完成了。所以子类只要在构造时,将异常信息传递给父类通过super语句。那么就可以直接通过getMessage方法获取自定义的异常信息。

重点!!!自定义异常,必须是自定义类继承Exception。

继承Exception原因:异常体系有一个特点:因为异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。

代码如下:

[java] view plain copy

1. package com.package2;

2.

3. //自定义异常类

4. class FuShuException extends Exception //getMessage();

5. {

6.     private int value;

7.

8.     //为空的构造方法

9.     FuShuException()

10.     {

11.         super();

12.     }

13.     //构造方法

14.     FuShuException(String msg,int value)

15.     {

16.         super(msg);

17.         this.value = value;

18.     }

19.

20.     //自定义异常类的成员方法,用来定义异常信息。

21.     public int getValue()

22.     {

23.         return value;

24.     }

25.

26. }

27.

28. class Demo

29. {

30.     int div(int a,int b)throws FuShuException

31.     {

32.         //增加判断条件

33.         if(b<0)

34.             throw new FuShuException("出现了除数是负数的情况------ / by fushu",b);//手动通过throw关键字抛出一个自定义异常对象。

35.

36.         return a/b;

37.     }

38. }

39.

40.

41. class  ExceptionDemo

42. {

43.     public static void main(String[] args)

44.     {

45.         Demo d = new Demo();

46.         try

47.         {

48.             int x = d.div(4,-9);

49.             System.out.println("x="+x);

50.         }

51.         catch (FuShuException e)

52.         {

53.             System.out.println(e.toString());

54.             System.out.println("除数出现负数了");

55.             System.out.println("错误的负数是:"+e.getValue());

56.         }

57.

58.         System.out.println("over");

59.

60.     }

61. }

运行结果如图所示:

caf67e024c38b946d71473f72ebbf983.png

五、throws和throw的区别:

throws使用在函数上。  throw使用在函数内。

throws后面跟的异常类,可以跟多个,用逗号隔开。  throw后跟的是异常对象。

六、运行时异常与编译时异常的区别:

答:运行时异常:只需要在方法内部抛出异常即可。调用该方法的地方不做任何处理。即程序就是计划让出现运行时异常的程序停止运行。

编译时异常:定义该方法时,需要在方法体上对异常进行抛出。在调用该方法的位置处,必须进行相应的异常处理,即选择捕获或者进行抛出(throws)。即,程序可以继续执行下去。

以上就介绍了JAVA的相关知识,希望对JAVA有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言JAVA频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值