文章目录
0. about
来源:java.lang中的Throwable类。Throwable有两个重要的子类:Exception(异常)Error(错误)。
0.1 Error && Exception
异常可以被程序本身处理。错误无法处理。
- Error : 程序无法处理的错误。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如: outOfMemory.
- 这些错误往往不可查,他们在程序的控制和处理能力之外。且
- Exeption : Excepton有一个重要的子类 RuntimeException.由java虚拟机抛出.
- NUllPointerException(要访问的变量没有引用任何对象时。抛出该异常)
- ArithmeticException (算术运算异常,一个整数处以0时,抛出该异常)
- ArrayIndexOutOfBoundsException(下标越界异常)
0.2 什么时候需要抛出异常?为什么抛出异常?
只有Java语言提供了Checked异常,就是必须在编译前处理,否则不予通过编译。即:没有完善处理的代码根本就不会被执行。也就是说Java中除了RuntimeException及其任何子类,其他异常类都被Java异常强制处理机制强制异常处理。
Java异常处理原则之一:延迟捕获
意思是,当异常发生时,不应立即捕获,而是应该考虑当前作用域是否有有能力处理这一异常的能力,如果没有,则应将该异常继续向上抛出,交由更上层的作用域来处理。
1. throws && throw
1.1 throw 关键字
- 1 异常处理结束后,再将异常抛出.让下一层异常处理块捕捉。直接使用throw new ArithmeticException;
- 2 程序发生错误无法处理的时候,会自动抛出对应的异常的对象.
1.2 throws 关键字
1.2.1 声明
- 1.在方法体申明时使用(表明该方法需要抛出这种类型的异常)。 这样编译器会检查调用该方法的代码片断有没有处理该异常。没有处理则编译不通过,强制需要处理。 除了RuntimeException 编译器都要求强制处理。
- 2.在类声明需抛出的异常。
-
则允许仅抛出部分异常(某个方法体只抛出类声明抛出异常的其中一个或某几个异常)
-
允许不在抛出异常。(某个方法体一个异常也不需要抛出)
-
允许抛出超类方法抛出异常的子类型异常()
-
不允许额外抛出类声明异常中未声明的异常
-
不允许抛出超类方法中抛出异常的超类异常。(例如声明了Nullpointer异常,则不可以抛出Exeption。只可以NullPointer)
public void setAge(int age) /** * 通过throws通知要抛异常。 */ throws Exception{ if(age>100 || age <= 0){ /** * 除了runtimeException 不需要通知。其他的都需要通知。 */ //throw new RuntimeException("年龄不合法"); throw new Exception("throw a new exception"); } this.age = age; }
-
1.3 异常处理总结
当我们调用一个含有throws声明抛出的异常的方法时,编译器要求我们必须处理该异常。(根据实际开发需求)处理得手段有两种:
使用 try-catch 捕获异常并处理
try块: 捕获异常。后接0至多个catch块(当0个时,必须有finally块)。
catch块: 用于处理try捕获到的异常。
finally块: 无论是否捕获或处理异常。finally块里的语句都会被执行。当try块或者catch块遇到return语句时,finally语句块将在方法返回之前被执行。
以下4种情况,finally块不会被执行或完全执行
- 在finally语句块中发生了异常
- 在前面的代码块中使用System.exit() 退出程序
- 程序所在的线程死亡
- CPU关闭
在当前方法中继续使用throws声明该异常,继续向上层抛出。
2. RuntimeException
TODO 01 : 常见的runtime异常有哪些?? `
java 异常分为可检测异常和非检测异常。
- 可检测异常: 可检测异常经过编译器验证之后,对于声明抛出的异常的任何方法.
- 编译器将强制执行处理和声明的规则,不捕捉并处理这个异常,编译器将会通不过。编译终止。 - 非检测异常: 非检测异常不遵循处理或声明规则。
- 在产生此类异常时,不一定非要采取任何适当的操作,编译器不会检查是否已经处理了该异常。
RuntimeException 类属于非检测异常。 因为普通JVM操作引起的运行时异常随时可能发生。
此类异常一般是由特定操作的引起。但这操作在java应用程序中会频繁的出现。因此他们不受编译器检查与处理或声明规则的限制。
3. 方法
-
printStackTrace()
- 在控制台上打印Throwable对象封装的异常信息
-
getMessage()
- 返回异常发生时的详细信息
- 自定义异常
- 返回异常发生时的详细信息
-
toString()
-
异常发生时的简要描述。
使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
-
-
getLocalizedMessage()
- 返回异常对象的本地化信息。
intro: 通常是用来定义业务逻辑上的某种类型的异常错误,声明其不合法。