【更多资讯及资料获取,关注微信公众号号:浅醉JAVA】
最近总结复习,所以写下这篇文章,不喜勿喷,如有建议,欢迎沟通交流。--------「Bang」
1.1 异常分类
目录
编译时异常—运行时异常(RuntimeException)
异常超级接口:Throwable
getMessage() :获取异常信息,返回字符串
toString() :获取异常类名和异常信息,返回字符串
printStackTrace() :打印异常类名和异常信息,以及异常出现在程序中的位置。(JVM默认就使用这种方式处理异常。)
1.1.1 区别:
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
编译时异常:java程序必须显示处理,否则程序就会发生错误,无法通过编译。
运行时异常:无需显示处理,也可以和编译时异常一样处理。
编译时异常:比如涉及到外部资源时,会让处理异常。不处理编译不通过。
(未雨绸缪异常:在做事时,先做好出现坏结果时的处理方法)
如:FileInputStream fs = new FileInputStream(“my.file”); -à会让进行异常处理
运行时异常:就是程序员所犯的错误,需要修改代码来解决。
1.2 JVM 默认是如何处理异常的
main函数收到这个问题时,有两种处理方式:
a. 自己将该问题处理,然后继续运行
b. 自己没有针对的处理方式,只有交给调用main的JVM来处理
JVM有一个默认的异常处理机制,就是将该异常进行处理。并将该异常的名称、信息、位置打印在控制台上,同时将程序停止运行。
1.3 自主处理异常的两种方式:
A : try… catch …finally :处理异常后,程序继续向下执行
try{
try 用来检测异常
}catch(NullPointException e){
可以有多个catch
}catch(Exception e){
catch 用来捕获异常
}finally{
finally用来释放资源
如:关闭数据库、流
}
B : throws
定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
那么就通过throws在方法上标识。
编译时异常:必须抛出
运行时异常:也可以不处理,不抛出
1.4 注意:
1.4.1 try…catch…
1)安卓,客户端开发:如何处理异常? try{ }catch(Exception e) { }
2)ee, 服务端开发:一般都是底层开发,从底层向上抛。
3)try后跟多个catch时,要把小的异常放前边,大的异常放后边。如果大在前,将会接收所有小异常。
4)JDK 1.7 多个catch处理新特性
catch(NullPointExceptin | IndexOutOfRangeException e){ } 可以多个异常在一个里面
1.4.2 throws
1) 编译时异常抛出
因为抛出的时Exception包含了编译时异常,所以要求必须显示的抛出处理。
public class ExceptionTest {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) throws Exception {
if(age > 0 && age <= 150){
this.age = age;
}else{
//将异常向上抛出给调用该方法的的main方法处理
throw new Exception("年龄非法");
}
}
//throws 又将该异常继续上抛出给调用这个main方法的JVM处理
//throws 标识,标识提醒JVM此处可能有异常
public static void main(String[] args) throws Exception {
ExceptionTest test = new ExceptionTest();
test.setAge(100);
}
}
2) 运行时异常抛出
下例是抛出的运行时异常,所以不要求进行处理。可以抛出也可以不抛出。
public class ExceptionTest {
private int age;
public int getAge() {
return age;
}
public void setAge(int age){
if(age > 0 && age <= 150){
this.age = age;
}else{
//因为抛出的是 运行时异常 不要求必须处理,所以可以抛出也可以不抛出处理。
throw new RuntimeException("年龄非法");
}
}
public static void main(String[] args){
ExceptionTest test = new ExceptionTest();
test.setAge(100);
}
}
3) throw 和 throws的区别
throws : 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
throw 的概述:
在功能方法内部出现某种情况,程序不能继续进行。需要进行跳转时,就用throw把异常对象抛出。
区别:
throws :
用在方法声明后面,跟的时异常类名
可以跟多个异常类名,并用逗号隔开(无先后顺序)
表示抛出异常,由该方法的调用者来处理
throw:
用在方法内部,跟的时异常对象。
只能抛出一个异常对象
表示抛出异常,有方法内部的语句处理。
1.4.3 finally
1) finally的特点
==被finally控制的语句体一定会执行
==特殊情况:在执行到finally之前,JVM退出了(比如:System.exit(0))
2) finally的作用:
==用于释放资源,在IO流操作中和数据库操作中常见
3) finally 和 final / finalize的区别
== final修饰类 、方法、变量
final修饰的类不能被继承,方法不能被重写,变量只能赋值一次。
== finally 是try语句中的一个语句体,不能单独使用,用于释放资源
== finalize 是一个方法。当垃圾回收器确定不存在对某对象的更多应用时,由对象回收 器调用该对象的该方法,回收该对象。
4) 如果catch里面有return语句,
请问finally的代码还会执行吗?
如果会,请问是在return前,还是后?
== 会执行。
== 在return 中间执行,return先开始操作,并没有彻底返回执行,而是在有finally的时候,执行完finally在进行彻底return。
1当: finally中没有return时 ,try或catch中有return?
在return中间,显示按照顺序执行,try或catch中的return一次,但是并没有真正的返回结果结束程序,而是已经把结果给了主函数(此后的操作不会对结果有影响),然后继续进行逻辑执行,即try-catch-finally的逻辑。最后会再一次执行try或catch中的return,返回上次给的结果,结束程序。
2 当:finall中有return时,无论try-catch什么情况?
如果catch中有return,则是catch先发起return,并将结果给到main方法,但并没有彻底结束。此时,再执行finally中的return,算是发起一次新的return,它的结果将覆盖旧的return结果。所以最终返回的时finally中的结果。
但是正常情况下,finally语句中是绝对不能写return返回语句的,因为它会覆盖try和catch中的结果。使他们毫无意义,就是犯罪啊。 他的真正作用是用来释放资源的。
3 另外,try语句块中能够抛出异常,然后执行catch语句;
结论:finally中的代码是在return 和break语句中间执行的。
1.5 自定义异常
1.5.1 为什么需要自定义异常?
==通过名字其他的异常区分开来,便于异常问题的排查和处理。
1.5.2 如何自定义异常?
== 继承 Exception
== 继承 RuntimeException
重写他们的构造方法。
1.6 异常的注意事项及如何使用异常处理
1) 继承中的异常:抛出
== 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类(父亲坏了,儿子不能比父亲更坏)
== 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或是他的子类,子类不能抛出父类没有的异常。
== 如果被重写的方法没有异常抛出,那么子类绝不可以抛出异常,如果子类方法内由异常发生,那么子类只能try,不能throws
2) 如何使用异常处理
== 原则:如果该功能内部可以将问题处理,用try;处理不了,交由调用者处理,,用throws
== 区别:后续程序需要继续运行就try
后续程序不需要继续进行就throws ( throw会将异常抛给调用者并停止程序运行)
== 如果JDK没有提供对应的异常,许哟啊自定义异常
【更多资讯及资料获取,关注微信公众号号:浅醉JAVA】