异常
一、
1、异常旗下两大分支:编译时异常和运行时异常
Exception->RunTimeException(运行时异常,又叫未受检异常、非受控异常),编写阶段可不处理,编译器没意见。
Exception->ExceptionSubClass(编译时异常,又叫受检异常、受控异常),是Exception的直接子类,编写程序时必须处理,不然报错。发生概率极高。
切记:所有异常都是发生在运行阶段的。
2、处理异常
第一种:在方法声明的位置上,使用throws关键字,抛给上一级。
eg:我是一个小职员,失误了,导致公司损失1000块,然后告诉了领导,这就是异常的上抛
第二种:使用try..catch语句进行异常捕捉。
eg:我还是那个小职员,但是我这次不告诉领导了,直接用我自己的钱补上,这就是异常的捕捉
注意:java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果,终止java程序的执行。
异常处理机制的作用就是增强程序的健壮性,争取做到发生异常也不影响程序的执行
3、方法声明位置上使用throws
Eg:
public static void doSome() throws ClassNotFoundException(){
Sout("dosome!!!");
}
这个时候要想在主方法直接调用doSome的话,那编译器就会报错(错误信息:未处理的异常,Unhandled exception)。
4、try..catch
语法:
try{
// 尝试,把可能出现问题的代码块放到这里
}catch(异常类 + 变量名){
//catch是捕捉到异常之后执行的分支,如输出一些错误信息
// 变量里面存的是异常对象的内存地址
}
// try..catch抓住异常之后,这里的代码会继续执行。
捕捉等于把异常拦下来,异常真正的解决了,调用者不知道发生过异常。
5、throws
throws相当于把异常上抛,推卸责任。但是要注意,抛出异常之后,当前方法就没有责任了,把责任抛给上级了。且
①往上抛的过程中,只能抛当前异常类及父异常类,级别低了不行。
②可以同时抛出多个异常
③一般不建议在main方法上使用throws
6、深入try…catch…
try{
FileInputStream fis =new FileInputStream("XXXXX");
//这里new了一个异常对象,try里发现异常,于是转交catch捕捉
}catch(Exception e){ // 异常类可以是当前异常类,也可以是其父类。
Sout("文件不存在 !");
}
①catch可以写多个。建议catch的时候,精确的一个一个处理,这样有利于程序的调试,也可以直接来一个catch(Exception e) ,省事。
②多个catch遵循"从上到下,从小到大"的原则
7、jdk8新特性
允许这么写catch(FileNotFoundException | ArithmeticException | NullPointerException),即以“或”的方式来写异常,方便处理
8、异常和捕捉怎么选择?
如果希望调用者来处理,throws上报;其他情况,直接捕捉。只有这一个原则
二、getMessage() 和 printStacktrace()方法
1、getMessage()方法
作用:获取异常的简单的描述信息,其实就是构造方法上String参数(传进去的)
String msg = exception.getMessage();
2、printStackTree()方法
作用:打印异常追踪的堆栈信息
Exception.printStackTrace();
3、举个例子
Eg:
NullPointerException e = new NullPointerException("空指针异常abc");
String msg = e.getMessage();
Sout(msg); // 输出“空指针异常abc”
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)