java——异常

异常:是在运行时期发生的不正常情况

在java中用类的形式对不正常情况进行了描述和封装对象。
描述不正常的情况的类,就称为异常类。

现在将正常流程代码和问题处理代码分离。提高阅读性.
其实异常就是java通过面向对象的思想将问题封装成了对象.

用异常类对其进行描述。
不同的问题用不同的类进行具体的描述。 比如角标越界。空指针等等。
问题很多,意味着描述的类也很多,
将其共性进行向上抽取,形成了异常体系。

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

Throwable:无论是error,还是Exception:,问题发生就应该可以抛出,让调用者知道并处理。
该体系的特点就在于Throwable及其所有的子类都具有可抛性。

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

其实是通过两个关键字来体现的。
throws throw ,凡是可以被这两个关键字所操作的类和对象都具备可抛性.

Throwable
|--Error 是系统不可恢复的错误,JVM发生的错误

| |--OutOfMemoryError 堆内存溢出
| |--StackOverflowError 栈内存溢出

|--Exception 程序可以检查处理的异常,常见的异常继承根

|--java.text.ParseException format 解析对象时候发生
| 如:Date d = dateformat.parse("2010-5-5");
|--RuntimeException 非检查异常,Javac忽略对这类异常的语法检查
|--IllegalArgumentException
|--NullPointerException
|--ArrayIndexOutOfBoundsException
|--ClassCastException
|--NumberFormatException * Integer.parseInt(S)

关于异常的分类:

1、Throwable 类是 Java 语言中所有错误或异常的超类(这就是一切皆可抛的东西)。它有两个子类:Error和Exception。
2、Error:用于指示合理的应用程序不应该试图捕获的严重问题。这种情况是很大的问题,大到你不能处理了,所以听之任之就行了,你不用管它。
3、Exception:它指出了合理的应用程序想要捕获的条件。Exception又分为两类:
一种是CheckedException,一种是UncheckedException。这两种Exception的区别主要是CheckedException需要用try...catch...显示的捕获,而UncheckedException不需要捕获。通常UncheckedException又叫做RuntimeException。

对于可恢复的条件使用被检查的异常(CheckedException),
对于程序错误(言外之意不可恢复,大错已经酿成)使用运行时异常(RuntimeException)。

4、我们常见的RuntimeExcepiton有
IllegalArgumentException、IllegalStateException、NullPointerException、IndexOutOfBoundsException等等。
对于那些CheckedException就不胜枚举了,我们在编写程序过程中try...catch...捕捉的异常都是CheckedException。io包中的IOException及其子类,这些都是CheckedException。

该体系的特点:
子类的后缀名都是用其父类名作为后缀,阅读性很强。
注意:
如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性。才可以被两个关键字所操作,throws throw

异常的分类:

1,编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系。
这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。这样的问题都可以针对性的处理。

2,编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类。
这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的而或者引发了内部状态的改变导致的。

那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修正。

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

throws 和throw的区别。

1,throws使用在函数上。
throw使用在函数内。
2,throws抛出的是异常类,可以抛出多个,用逗号隔开。
throw抛出的是异常对象。

异常:阻止当前方法或作用域继续执行的问题
调用抛出异常的方法,必须处理异常,有两种方式:
1、使用try catch finally 捕获。
2、直接再抛出异常。
捕获异常

1) try 是尝试运程代码块,如果有异常会被随后的catch捕获,异常发生以后代码不执行。
2) catch代码块是异常处理代码,需要提供合理的处理。
1、异常的处理是不具体业务逻辑有关。
2、可以写多个catch处理一系列异常,但是要注意:异常的大小关系,大类型的放到后面处理。
3) 有的时候直接catch(Exception) 粗粒度处理异常,代码简洁,语义含糊. 根据业务逻辑适 当选用。
4) finally代码块,不管是否出现异常,总会执行的代码块。
1、finally经常用来处理现场的清理,比如:可靠的数据库连接关闭。
5) 处理异常有一个基本原则:能够底层处理的尽量处理,但是如果不能处理,必须抛出到调用者 (方法)。不应该简单的抛弃。
6) 异常捕获再抛出, 是一种把底层异常迚行封装,转换为另外一种异常类型。
7) 建议在捕获到异常时候使用e.printStackTrace(),打印到控制台。
1、输出内容是:出现异常时候的方法调用堆栈。
2、一般情况下,凡是捕获异常代码都输出:e.printStackTrace()
3、finally永远会被执行。
4、捕获(catch)异常有顺序,异常“由小到大”,否则会出编译错误。

异常处理的原则:

1,函数内容如果抛出需要检测的异常,那么函数上必须要声明。
否则必须在函数内用trycatch捕捉,否则编译失败。

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

3,什么时候catch,什么时候throws 呢?
功能内容可以解决,用catch。
解决不了,用throws告诉调用者,由调用者解决 。

4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。
内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

自定义异常

软件中会大量使用自定义异常,一般从Exception继承异常类命名要有实际意义, 一般都手工继承父类的构造器。

你可能感兴趣的:(java——异常)