黑马程序员_Java异常

时间:2022-01-13 00:44:20

   -

----------- android培训java培训、java博客、java学习型技术博客、期待与您交流! --------------


本章主要的知识点总结:1、异常的简介和异常体系

                                        2、异常的声明和处理方式

                                       3、如何自定义异常及异常的好处

 

 一、异常的简介


    异常:就是程序在运行时出现不正常情况或错误。如程序要打开一个不存的文件、网络连接中断、操数组越界、装载一个不存在的类等。

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

     异常体系:

    Throwable

      |--Error

      |--Exception

       |--RuntimeException

Throwable表示Java中可被抛出的对象,它是所有错误和异常的父类

Throwable有两个子类:Error、Exception

Error表示错误

Exception表示异常

RuntimeException表示运行时异常,是Exception的子类

 

    异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。 也就是说可以被throw和throws关键字所操作。 只有异常体系具备这个特点。

     throw和throws的用法:

     1、 throw定义在函数内,用于抛出异常对象。

     2、 throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。

 

    异常以问题严重程度的划分两种:一种是严重的问题Error(错误),一种非严重的问题,Exception(异常) 

Error(错误)---由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其一般不编写针对性的代码对其进行处理

Exception(异常) ---所有异常类的父类,子类定义了各种各样可能出现的异常事件,一般需要用户显式地声明向外抛出或捕获。

  无论Error或者Exception都具有一些共性内容比如:不正常情况的信息,引发原因等。

  另外以异常发生时机划分两种

  1、Runtime Exception(运行时异常)

一类特殊的异常,如被0除、数组角标越界等。产生比较频繁,处理麻烦,如果每次都处理,会对程序可读性和运行效率影响比较大,因此由系统检测并将它们交给缺省的异常处理程序,用户不必对其进行处理。这类异常不处理,编译时不会报错,只是在运行时出现错误时才报告异常,所以我们称之为运行时异常,所有RuntimeException的子类都是运行时异常。我们也可以对运行时异常进行处理。

   2、编译时异常

Exception中除了RuntimeException的子类,其他异常都是必须要处理的,如果不处理,编译时会报错,这些异常我们称之为编译时异常。 

    

二、异常的处理 


在程序中可以在方法后面使用throws关键字声明向外抛出异常,对于编译时异常,通常我们需要使用try……catch语句进行捕获 。

java 提供了特有的语句进行处理。 

try

{

需要被检测的代码;

}

catch(异常类 变量)

{

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

}

finally

{

一定会执行的语句;//通常用于关闭资源。

}

  finally可以结合try……catch使用,出现异常,finally里面的代码也会执行finally,只有一种情况不会执行当执行到System.exit(0),finally不会执行

 

throws和throw的区别

throws使用在函数上。

throw使用在函数内。

throws后面跟的异常类。可以跟多个。用逗号隔开。

throw后跟的是异常对象。

   对多异常的处理:

 

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

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

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

   在进行catch处理时,catch中一定要定义具体处理方式不要简单定义一句 e.printStackTrack()也不要简单的就书写一条输出语句。

当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

try

{

throw new AException();

}

catch (AException e)

{

throw e;

} 


三、自定义异常

 

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

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

 

例如: 异常异常信息传递给父类的构造函数。

class MyException extends Exception

{

MyException(String message)

{

super(message);

}

} 

 

   自定义类必须是继承Exception继承Exception原因:异常体系有一个特点:因为异常类和异常对象都被抛出他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。只有这个体系中的类和对象才可以被throws和throw操作。自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。

     Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过如果在函数上声明了该异常。调用者可以不用进行处理编译一样通过;之所以不用在函数声明,是因为不需要让调用者处理。

    当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

 

异常的好处:

 1、将问题进行封装。

 2、将正常流程代码和问题处理代码相分离,方便于阅读。


异常的注意事项:

 在子父类覆盖时:

 1、子类抛出的异常必须是父类的异常的子类或者子集。

 2、如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。