黑马程序员-异常

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

写在前面,在写这个异常博客时候,突然想起来 Thinking In  java的作者 埃克尔说过,异常时java里面最大的败笔,(因为真的很麻烦,我也是深有感触),当然此话一出,java之父 詹姆斯·高斯林当然不干了,然后两个软件领域的泰山北斗开始了撕逼大战(哈哈哈!!!)。
  • 异常的体系:

Throwable

Error: 通常是出现重大问题抛出此异常,如运行的类不存在或则内存溢出,不用编写代码进行处理。

Exception: 在运行时出现的一种情况,可以通过try,catch,finally进行处理,也可以throws

Exception和Error的子类名称都是以父类名称作为后缀。

  • 异常的处理机制:


也可以抛出异常:


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

2.对方声明的几个异常就应该有对应的几个catch块,不要定义多余的catch块,如果多个catch块中的异常出现继承关系,父类异常的catch块应该放在最下面。

3.建立在进行catch处理时,catch中一定要定义具体的处理方式,不要简单的定义一句e.printStackTrace(),也不要简单的输出语句。

  • throw和throws的区别:

throw使用在函数内,而throws是使用的函数上

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

  • 自定义异常信息:

因为有的项目会出现特有的问题,而这些问题并未被java所描述并封装对象。

所以对于这些特有的问题可以按照java对问题封住的思想将特有的问题进行自定义异常封装。

  • 运行时异常:

Exception中有一个特殊的子类,RuntimeException,运行时异常,如果在函数中抛出这个异常,函数可以不用声明,编译一样通过。

之所以不用再函数声明,是因为不需要让调用者处理,当异常发生,希望程序停止,

因为在运行时出现了无法继续运算的情况,希望停止对代码进行修正,

自定义异常时,如果该异常的发生无法继续在进行运算,就让自定义异常标签继承RuntimeException。

对异常分为两种,编译时被检测的异常,和编译时不被检测的异常(运行时异常RuntimeException和其子类)

  • 异常在字符类中的体现:

1.子类在覆盖父类时,如果父类抛出异常,那么子类的覆盖方法,只能派出父类的异常或者改异常的子类。

2.如果父类方法抛出多个异常,那么子类在覆盖改方法时,只能抛出父类异常的子集。

3.如果父类或者接口中的方法没有抛出异常,就必须要进行try处理,绝对不能抛。


  • 异常链不能断!

将发生MyException异常,程序调转到catch (MyException e)代码块中执行

如果调用quotient()将会因“除数为0”错误引发ArithmeticException异常,属于运行时异常类,由Java运行时系统自动抛出。quotient()方法没有捕捉ArithmeticException异常,Java运行时系统将沿方法调用栈查到main方法,将抛出的异常上传至quotient()方法的调用者:

         int result = quotient(a, b); // 调用方法quotient()
        由于该语句在try监控区域内,因此传回的“除数为0”的ArithmeticException异常由Java运行时系统抛出,并匹配catch子句:

       catch (ArithmeticException e) { // 处理ArithmeticException异常
System.out.println("除数不能为0"); // 输出提示信息

        处理结果是输出“除数不能为0”。Java这种向上传递异常信息的处理机制,形成异常链

       Java方法抛出的可查异常将依据调用栈、沿着方法调用的层次结构一直传递到具备处理能力的调用方法,最高层次到main方法为止。如果异常传递到main方法,而main不具备处理能力,也没有通过throws声明抛出该异常,将可能出现编译错误。

3.如果还发生其他异常,将使用catch (Exception e)捕捉异常。由于Exception是所有异常类的父类,如果将catch (Exception e)代码块放在其他两个代码块的前面,后面的代码块将永远得不到执行,就没有什么意义了,所以catch语句的顺序不可掉换。

  • Throwable类中常用的方法

注意:catch关键字后面括号中的Exception类型的参数e。Exception就是try代码块传递给catch代码块的变量类型,e就是变量名。catch代码块中语句"e.getMessage();"用于输出错误性质。通常异常处理常用3个函数来获取异常的有关信息:

     getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。

  getMeage():返回异常的消息信息。

  printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。

     有时为了简单会忽略掉catch语句后的代码,这样try-catch语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会忽略处理异常,而错误发生的原因很难查找。

  • 常见的异常:
  • RuntimeException

    1、 java.lang.ArrayIndexOutOfBoundsException
    数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
    2、java.lang.ArithmeticException
    算术条件异常。譬如:整数除零等。
    3、java.lang.NullPointerException
    空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等
    4、java.lang.ClassNotFoundException
    找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。

   5、java.lang.NegativeArraySizeException  数组长度为负异常

   6、java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常

   7、java.lang.SecurityException 安全性异常

   8、java.lang.IllegalArgumentException 非法参数异常


  • IO异常

IOException:操作输入流和输出流时可能出现的异常。

EOFException   文件已结束异常

FileNotFoundException   文件未找到异常

  • 3.其他异常

ClassCastException    类型转换异常类

ArrayStoreException  数组中包含不兼容的值抛出的异常

SQLException   操作数据库异常类

NoSuchFieldException   字段未找到异常

NoSuchMethodException   方法未找到抛出的异常

NumberFormatException    字符串转换为数字抛出的异常

StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常

IllegalAccessException  不允许访问某类异常

InstantiationException  当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值