异常 https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html
常用方法:
* void printStackTrace():打印堆栈信息
打印异常信息 + 异常产生原因
1. 异常体系
异常是在程序中断运行是的一种指令流,如:文件找不到、非法参数、网络超时...
为保证程序正常运行,设计程序是必须考虑到各种异常情况,并对异常进行处理。
* 异常也是一种对象,Java中有许多异常类,并且定义了基类 java.lang.Throwable,
* 它是所有异常的超类。
异常分为两种:Error和Exception
Error:程序无法处理
有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。
比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。
这类错误不可查,非代码性错误,应用不应该去处理此类错误。
Exception:程序可以捕获和处理
1. 运行时异常(不受检异常):运行时
* NullPointerException
* ArrayIndexOutBoundException
2. 编译异常(受检异常):
* IOException
2. 异常处理流程
1. 抛出异常:一个方法出现错误引发异常,该方法会将该异常类型以及一场出现的程序状态信息
封装为异常对象,交给本应用。该应用寻找处理异常的代码执行,任何代码都可以通过throw抛出。
2. 捕获异常:一旦方法抛出异常,系统自动根据该异常对象寻找异常处理器(Exception Handler)
处理该异常
1. Error =》 JVM处理
2. 可查异常 =》 捕获 或者 抛出
2.1 捕获异常
try-catch
try {
//监控区
}catch (ExceptionType1 e) {
//捕获并处理ExceptionType1的异常
}catch(ExceptionType2 e) {
//捕获并处理ExceptionType2的异常
}
监控区一旦发生异常,则会根据当前运行时的信息创建异常对象,并将该异常对象抛出监控区,同时系统根据该异常对象依次匹配catch子句,运行其中catch代码块中的异常处理代码,一旦处理结束,那就意味着整个try-catch结束。
try-catch-finally
try {
//监控区
}catch (ExceptionType1 e) {
//捕获并处理ExceptionType1的异常
}catch (ExceptionType2 e){
//捕获并处理ExceptionType2的异常
}finally{
//一定会执行
}
try块中发生异常后抛出,异常后面的语句不会被执行
不要在finally块中有return,不要通过catch来控制代码流程
2.2抛出异常
1. throws抛出异常:在方法名上
产生异常的方法没有能力处理,交给调用它的上层方法
2. throw抛出异常:在方法内
在方法内,用throw来抛出一个Throwable类型的异常。一旦遇到到throw语句,后面的代码将不被执行
然后,便是进行异常处理——包含该异常的try-catch最终处理,也可以向上层抛出。
* 在catch中抛出异常,这也是允许的
2.3 异常关系链
在实际开发过程中经常在捕获一个异常之后抛出另外一个异常,
并且我们希望在新的异常对象中保存原始异常对象的信息,实际上就是异常传递
2.4 异常类型转换
为了更准确的描述异常:
将一种类型的异常转成另一种类型的异常,然后再抛出异常。
1、 Error——>Exception
2、 Error——>RuntimeException
3、 Exception——>RuntimeException
class MyException extends Exception{//定义自定义异常类型
public MyException(String msg, Throwable e){
super(msg,e);
}
}
public class Demo {
public static void main(String[] args) throws MyException {
File file = new File("D:/a.txt");
if (file.exists()){
try {
file.createNewFile();
} catch (IOException e){
e.printStackTrace();
throw new MyException("文件创建失败", e);//抛出自定义异常
}
}
}
}
//将自定义的异常对象抛出去,调用它的对象就可以捕获打印它的信息。