码迷,mamicode.com
首页 > 其他好文 > 详细

6:异常处理

时间:2015-10-26 18:35:19      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

异常处理


异常:是在运行时期发生的不正常情况。在java中用类的形式对不正常情况进行了描述和封装对象。 

描述不正常的情况的类,就称为异常类。  


以前正常流程代码和问题处理代码相结合, 现在将正常流程代码和问题处理代码分离。提高阅读性.

其实异常就是java通过面向对象的思想将问题封装成了对象.用异常类对其进行描述。


不同的问题用不同的类进行具体的描述。 比如角标越界。空指针等等。

问题很多,意味着描述的类也很多,将其共性进行向上抽取,形成了异常体系。


最终问题(不正常情况)就分成了两大类。


 |--1,一般不可处理的。Error

   特点:是由jvm抛出的严重性的问题。

     这种问题发生一般不针对性处理。直接修改程序

 |--2,可以处理的。Exception

该体系的特点:

 子类的后缀名都是用其父类名作为后缀,阅读性很想。


异常可分为俩类

Error:jvm系统内部错误,我们对Error无能为力

Exception:编程错误或偶然的外在因素导致的一般性问题


Exception分非检查异常(RuntimeException)和检查异常

RuntimeException:空指针异常、数组下标越界异常、类型转换异常、算术异常

检查异常:编译时异常,即编写代码时就要求处理的异常

技术分享 

技术分享 


Throwable:无论是error,还是异常,问题,问题发生就应该可以抛出,让调用者知道并处理。

   该体系的特点就在于Throwable及其所有的子类都具有可抛性。

   可抛性到底指的是什么呢?怎么体现可抛性呢?

   其实是通过两个关键字来体现的。

   throws throw ,凡是可以被这两个关键字所操作的类和对象都具备可抛性.

throws 和throw的区别。 

1,throws使用在函数申明上。 

   throw使用在函数内。

2,throws抛出的是异常类,可以抛出多个,用逗号隔开。

   throw抛出的是异常对象。

throws是用来声明一个方法可能抛出的所有异常信息
throw则是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常(try---catch),而后在对其进行相关包装,最后在将包装后的异常信息抛
 
  1. //异常标准写法:
  2. public Test() throws RepletException {
  3. try {
  4. System.out.println("Test this Project!")
  5. }
  6. catch (Exception e) {
  7. throw new Exception(e.toString());
  8. }
  9. }

负数角标这种异常在java中并没有定义过。

那就按照java异常的创建思想,面向对象,将负数角标进行自定义描述。并封装成对象。

这种自定义的问题描述成为自定义异常。  

注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性

 才可以被两个关键字所操作,throws throw

自定义异常时,要么继承Exception。要么继承RuntimeException。

如果继承exception则需要在函数处用throws抛出,继承了RuntimeException可以不用这样

 

Exception和RuntinmeException

技术分享 

  1. class FuShuIndexException extends Exception {
  2. FuShuIndexException() {
  3. }
  4. FuShuIndexException(String msg) {
  5. super(msg);
  6. }
  7. }
  8. class Demo {
  9. public int method(int[] arr, int index) throws NullPointerException// FuShuIndexException
  10. {
  11. if (arr == null)
  12. throw new NullPointerException("数组的引用不能为空!");
  13. if (index >= arr.length) {
  14. throw new ArrayIndexOutOfBoundsException("数组的角标越界啦,哥们,你是不是疯了?:"
  15. + index);
  16. }
  17. if (index < 0) {
  18. throw new FuShuIndexException("角标变成负数啦!!");
  19. }
  20. return arr[index];
  21. }
  22. }
  23. class ExceptionDemo {
  24. public static void main(String[] args) throws FuShuIndexException// NullPointerException
  25. {
  26. int[] arr = new int[3];
  27. Demo d = new Demo();
  28. int num = d.method(null, -30);
  29. System.out.println("num=" + num);
  30. System.out.println("over");
  31. }
  32. }

异常处理的捕捉形式:

这是可以对异常进行针对性处理的方式。

具体格式是: 

try 

{

 //需要被检测异常的代码。

}

catch(异常类 变量FuShuIndexException e)

//该变量用于接收发生的异常对象,抛什么就catch什么

{

 //处理异常的代码。

}

finally

{

 //一定会被执行的代码。

}

异常处理的原则: 

1,函数内容如果抛出需要检测的异常(throw),那么函数上必须要声明(throws)。

   否则必须在函数内用trycatch捕捉,否则编译失败。

2,如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。 

3,什么时候catch,什么时候throws 呢? 

   功能内容可以解决,用catch。

   解决不了,用throws告诉调用者,由调用者解决 。

4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。 

   内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

  1. class ExceptionDemo {
  2. public static void main(String[] args) {
  3. int[] arr = new int[3];
  4. Demo d = new Demo();
  5. try {
  6. int num = d.method(null, -1);
  7. System.out.println("num=" + num);
  8. } catch (NullPointerException e) {
  9. System.out.println(e.toString());
  10. } catch (FuShuIndexException e) {
  11. System.out.println("message:" + e.getMessage());
  12. System.out.println("string:" + e.toString());
  13. e.printStackTrace();// jvm默认的异常处理机制就是调用异常对象的这个方法。
  14. System.out.println("负数角标异常!!!!");
  15. }
  16. //多catch父类的catch放在最下面
  17. catch(Exception e) { }
  18. System.out.println("over");
  19. }
  20. }


需要注意的:

技术分享 

异常处理try....catch

技术分享

异常抛出过程

技术分享

finally通常用于关闭(释放)资源。

/*

连接数据库 

查询。Exception

关闭连接。

*/ 

try catch finally 代码块组合特点:

1, try catch finally

2, try catch(多个)当没有必要资源需要释放时,可以不用定义finally。

3, try finally 异常无法直接catch处理,但是资源需要关闭。

  1. void show()throws Exception 
  2. {
  3.  try
  4.  {
  5.   //开启资源。
  6.   throw new Exception();
  7.  }
  8.  finally
  9.  {
  10.   //关闭资源。
  11.  }

异常的注意事项:

1,子类在覆盖父类方法时,父类的方法如果抛出了异常, 

那么子类的方法只能抛出父类的异常或者该异常的子类。

2,如果父类抛出多个异常,那么子类只能抛出父类异常的子集。 

简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。  

注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try .


 

技术分享 

 


异常处理机制:

技术分享 

技术分享 


异常处理的标准结构:

  1. class Exception {
  2. public static int div(int x, int y) {// 异常由被调用者处理
  3. int result = 0;
  4. System.out.println("1.除法计算开始,打开计算功能");
  5. try {
  6. result = x / y;
  7. } catch (java.lang.Exception e) {
  8. throw e;
  9. } finally {
  10. System.out.println("2.除法计算结束,关闭计算功能");
  11. }
  12. return result;
  13. }
  14. public static void main(String[] args) {
  15. try {
  16. System.out.println("除法计算结果:" + div(10, 0));
  17. } catch (java.lang.Exception e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }






6:异常处理

标签:

原文地址:http://www.cnblogs.com/liuyu0529/p/4911736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!