黑马程序员——异常的学习笔记和总结

来源:互联网 发布:淘宝网鱼缸 编辑:程序博客网 时间:2024/05/29 10:06

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

异常: 

就是Java代码编译和运行过程中出现错误的情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。

 

异常体系关系

Throwable : Throwable 类是 Java 语言中所有错误或异常的超类

 

|- Error : 错误,我们解决不了,不管了(如:JVM崩溃了,内存不足(栈溢出)等)

|- Exception: 异常

|- 编译期异常: 代码编写结束编译后,产生错误时我们今天要解决的就是这个问题

Date date = new DateFormat().parse("20151126"); 

|- RuntimeException运行期异常: 代码编译过程中没出错,运行的时候出错了

--------------------------------------------------------------------------------------------------------

 * 异常处理: 

 *  方式1: 出现异常,自己解决

 *  格式:

 *  try {

 *  可以会出现异常的代码

 *  } catch (异常类  对象名) {

 *  异常处理的方式

 * 

 

* 方式2:出现异常,别人给我解决,我不管

*格式:

* 修饰符 返回值类型 方法名(参数) throws 异常类名1, 异常类名2,... {

* 可能出现异常的代码

* }

* 案例:

* //出现了异常,我不解决,抛出去,让调用者解决

* public static void method() throws ParseException{//抛出了一个异常

* //产生一个编译期异常

* Date date = new SimpleDateFormat("yyyyMMdd").parse("2015-11-26");

* System.out.println(date);

* }

--------------------------------------------------------------------------------------------------------------

 

 * 多个异常如何处理

 *  方式1: 

 *  每一个异常单独处理

 *  这种方式,所有的代码都会执行到

 * 

 *  方式2

 *   可以把多个异常,一起处理,使用一个try,对应着多个catch的方式

 *   try {

 *   可以出现异常的代码

 *       } catch(异常类对象1){

 *       处理方式

 *       } catch(异常类对象2){

 *        处理方式

 *       } ....

 *      

 *      这种方式,当try代码块中出现异常后,try中的代码不再向下执行,直接跳转到对应的Catch中执行

 *      

 *      案例:

 *      问:当前第二种处理方式是不是不太合理啊,后面的代码都不执行了?

 * 答:这种方式是合理的

 *      比如: 你要开车回家, 可能会出现车轮子被偷的情况,没油的情况等;

 * 当第一种异常车轮子被偷 出现后, 你还会继续开车吗?

 * 必然不会后面的操作

 * 方式3: 平行异常  jdk7以后出现的情况

 * 格式:

 * try {

 *    可以出现异常的代码

 *        } catch(异常类1 || 异常类2|| ...  e ){

 *       处理方式

 *   

 *

  异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。

 

特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。

 

-----------------------------------------------------------------------------------------------------------------------

 * 异常类中常用的方法

 *  Throwable:

 *  获取到异常类名

 *  获取到异常原因

 *  获取到异常产生的位置

 * 

 * public String getMessage() 

 *  获取到异常原因

 * 

 * public String toString()

 *  获取到异常类名

 *  获取到异常原因

 * 

 * public void printStackTrace()

 *  获取到异常类名

 *  获取到异常原因

 *  获取到异常产生的位置

 

 -------------------------------------------------------------------------------------------------------------------------

 异常类的关键字:

  try: 在进行自己处理异常时使用,用来包含可能出现异常的代码

  catch: 在进行自己处理异常时使用,用来将产生的异常进行处理

  throws: 异常抛出交给调用者处理,只能在方法声明后面使用  代表该方法可能会抛出一个或多个异常对象

  throw : 只能在方法内部使用,代表一定抛出了一个异常对象

  finally: 它是异常处理语句的一部分,编写不管try代码块是否有异常产生,我都必须要执行的代码

 

throw 和throws关键字的区别:

throw用于抛出异常对象,后面跟的是异常对象;throw用在方法内。

throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在方法上。

 

 -------------------------------------------------------------------------------------------------------------------------------

编译时被检查的异常和运行时异常的区别:

    编译被检查的异常在方法内被抛出,方法必须要声明,否编译失败。

    声明的原因:是需要调用者对该异常进行处理。

     运行时异常如果在方法内被抛出,在方法上不需要声明。

    不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。

 

定义异常处理时,什么时候定义try,什么时候定义throws呢?

  功能内部如果出现异常,如果内部可以处理,就用try;

  如果功能内部处理不了,就必须声明出来,让调用者处理。

 

-------------------------------------------------------------------------------------------------------------------------------

 自定义异常:  其实就是自定义一个类 继承Exception 或者继承RuntimeException ,这样  该类就是异常子类了

 

  public class ATMException extends Exception {

public ATMException() {

super();

}

public ATMException(String message) {

super(message);

}

}


 自定义异常的步骤:

1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。

2:通过throw 或者throws进行操作。

 

异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。

--------------------------------------------------------------------------------------------------------------------------------

 return 与  throw 的区别?

  共同点:

  结束方法的运行并返回

  不同点:

  return 返回的成员为 变量值或者是普通对象值

  throw  返回的成员为 异常对象

 

 ----------------------------------------------------------------------------------------------------------------

 * 一个try 应多个catch()

 * 注意: 如果多个异常中有继承关系,子异常写上面,父异常写下面

try {

System.out.println(4/4);

//上面出现了异常,下面的代码不执行

int[] arr = {1,2,3};

System.out.println(arr[3]);

} catch (ArithmeticException e) {

e.printStackTrace();

} catch (Exception e) {//多态 Exception e = new ArrayIndexOutOfBoundsException();

e.printStackTrace();

}

throws

  如果多个异常中有继承关系,只抛出父类异常即可,也可以都抛出

private static void method2() throws ArithmeticException, RuntimeException {

System.out.println(4/0);

//上面出现了异常,下面的代码不执行

int[] arr = {1,2,3};

System.out.println(arr[3]);

}

------------------------------------------------------------------------------------------------------------------------------

 * finally: 它是异常处理语句的一部分

 * 

 *  格式:

 *  try{

 *  可能产生异常的代码

 *  } catch (异常类名  对象名) {

 *  异常的处理代码

 *  } finally {

 *  不管try代码块是否有异常产生,我都必须要执行的代码

 *  }

 

  注意:

  在执行到finally语句前,如果JVM结束了,该finally语句不执行

-------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

0 0
原创粉丝点击