java异常的概念

概念:程序在运行时可能出现的一些错误称为异常,它中断了正在执行的程序的正常指令流。

体系如下:参考  这篇文章,注意Exception和Error的区别

检查异常:一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应

                  该为这样的异常时刻准备着。eg:IOException,SQLException,ClassNotFoundException等

非检查异常(即RuntimeException):编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理这样的

                  异常,也可以不处理。eg:NullPointerException,ArrayIndexOutOfBoundsException,ArithmeticException,ClassCastException等

 

try-catch-finally语句捕获异常

 1 try{
 2 //一些会抛出的异常
 3 }catch(Exception e){
 4 //第一个catch
 5 //处理该异常的代码块
 6 }catch(Exception e){
 7 //第二个catch,可以有多个catch
 8 //处理该异常的代码块
 9 }finally{
10 //最终要执行的代码
11 }

几点说明要记住:

  • try块中的局部变量和catch块中的局部变量(包括异常变量),以及finally中的局部变量,他们之间不可共享使用。
  • 每一个catch块用于处理一个异常。异常匹配是按照catch块的顺序从上往下寻找的,只有第一个匹配的catch会得到执行。匹配时,不仅运行精确匹配,也支持父类匹配,因此,如果同一个try块下的多个catch异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面,这样保证每个catch块都有存在的意义。
  • finally块不管异常是否发生,只要对应的try执行了,则它一定也执行。只有一种方法让finally块不执行:System.exit()。因此finally块通常用来做资源释放操作:关闭文件,关闭数据库连接等等。

throws和throw抛出异常

抛出的意思是:某个方法可能发生异常,但不想在这个方法中处理异常,就可以将异常向上抛出,由方法的调用者来处理。

throws的使用

throws关键字通常被应用与声明方法时,用来指定方法可能抛出的异常,多个异常可用于逗号分隔,如下:

1  public void 方法名(参数列表)
2     throws 异常列表{
3          //程序过程
4  }

 

两点要注意:

  • 如果是检查异常,调用时必须用try-catch的方法来执行;如果是RuntimeException,可以不用throws抛出,仍能通过编译,但运行时会被系统抛出;
  • 将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但注意上一级的调用函数也要写出throws的样子,且最终要有处理该异常的代码;

throw的使用

throw 语句必须写在函数中,单独使用执行throw 语句的地方就是一个异常抛出点,它和由JRE自动形成的异常抛出点没有任何差别。eg:

1 public void save(User user)
2 {
3       if(user  == null) 
4           throw new IllegalArgumentException("User对象为空");
5       //......
6  
7 }

通过throw抛出异常后,如果要在上一级来捕获并处理(即try-catch)异常,则需要在抛出异常的方法中使用throws关键字在方法中声明中指明要抛出的异常.

如果抛出的是RuntimeException则既可以显示使用try…catch捕获也可以不理会它 ;如果是检查异常,调用时必须用try-catch的方法来执行。eg:

 1 public class ThrowTest {
 2     public static void main(String[] args) {
 3         try{
 4             throwChecked(3);
 5         }catch(Exception e) {
 6             System.out.println(e.getMessage());
 7         }
 8         throwRuntime(-3);
 9     }
10     //该方法内抛出一个Exception异常对象,必须捕获或抛给调用者
11     public static void throwChecked(int a) throws Exception {
12         if(a < 0) {
13             throw new Exception("a的值应大于0,不符合要求")
14         }
15     }
16     //该方法内抛出一个RuntimeException对象,可以不理会直接交给JVM处理
17     public static void throwRuntime(int a) {
18         if(a < 0) {
19             throw new RuntimeException("a的值应大于0,不符合要求")
20         }
21     }
22 }

throws和throw的区别总结:

  • throws出现在方法函数头;而throw出现在函数体。
  • throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
  • 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

 

自定义异常

如果要自定义异常类,则扩展Exception类即可,因此这样的自定义异常都属于检查异常(checked exception)。如果要自定义非检查异常,则扩展自RuntimeException。

先继承,再调用!!!!!

 

posted on 2019-01-18 17:31  羊刀塔姆  阅读(62)  评论(0)    收藏  举报