异常 throw 与 thorws 的个人理解:
throws 是声明一个异常,throw 在方法体内使用语法上会紧跟着 new 一个异常,这个是等于抛出一个异常的实例对象,而凡是 throws 声明异常的方法,调用方则必须要进行尝试 try-cacatch 或者继续 throws 声明给别人去处理,这里如果一直没人处理将最后会交给虚拟机去处理,性能上可能没有自己处理的来得快。
在 throw 的过程中有两种情况,一种是抛出必检异常,另一种是抛出继承了 RuntimeException 的免检类型异常,在编译器映射在现实中,编译器可以理解为一种规则,也可以想象为一个人对另一个人的心理印象标签!!!(不明白可以继续看后面打比方的形容)
编译器会进行检查,如果你 throw 一个异常是一个必检类型的异常,则会提示你在方法头上还要额外是进行 throws 声明这个异常的可能性,使调用方能知道,但是如果 throw 的是一个免检异常则编译器不会强制性的让你 throws 声明,因为编译器也无法真正的预知到。
打比方:
打个现实中的比方,调用一个随时可以出现异常的方法,就好比调用方是询问者,异常方法是被问者。但是 throws 就好比这个被问的人曾经是犯过罪的或者在询问的人心里是一个随时需要提防的一个人,那么它就得随时的自己 try-ca… 提防他,如果询问方自己不想提防,则可以雇一个保镖或者告诉他旁边的朋友来进行提防,自己则可以放心的和他进行交流询问。如果这个被问者头上没有 throws ,只有方法内部 throw 了一个免检异常(如果是必检异常,编译器才会要求强制声明),就是代表这个被问方可以值得询问方信赖的人,所以不需要提防try 和 throws 继续让周围的让帮他提防,但是这个被问方虽然是可信赖的,但是它自己方法内也就是他这个人的心理情况,也是有可能出现异常错误的,只是这个不会被编译时被发现,只有运行的时候也就是和询问方进行真正交流的时候会对询问方产生威胁,如果在 throw 中加了一个 if 判断,则代表着这个被问方,心理有着这么一个心理状态,“如果他问我有没有女朋友,我就干死他!!!”。但是询问方并不真正的知道他真实的心理状况,虽然没有提防,但不代表他不会对我产生威胁!!!
// 一个主动询问的询问者
public void inquiry() {
// 与被问者1进行交流
// 这个时候在与有危险的被问者谈话,编译器告诉他,这个人需要提防
// 或者可以理解为询问者有多年的面人经验,一眼就觉得这个人有危险!!!
// 如果我自己来提防他,则需要自己 try,
// 否则继续 throws 往外声明,交给旁边的人或者找个保镖替我提防,
// 我则自己可以不用 try 提防
try {
// 与被问者交流
asked();
} catch (IOException e) {
e.printStackTrace();
}
// 与被问者2进行交流
// 询问者自己比较信赖他很放心的和他在谈话
asked("你吃过了吗?");
// 如果询问者比较多疑,则也可以进行 try 地方,甚至可以 throws 叫个人帮他提防
try {
asked("你吃过了吗?");
} catch (RuntimeException e) {
e.printStackTrace();
}
// 但是询问者在不知道被问者2的心理情况之下,问了不该问的
// 虽然主观信赖,但是依然可能在交流时(程序运行时)被打,构成实质性的威胁
asked("你有没有女朋友?");
}
// 被问者1:这个被问方是个可能抛出异常,可能威胁到询问方的被问者
public void asked()throws IOException {
// ...
}
// 被问者2:这是个口碑比较好的被问方,至少编译器觉得是值得信赖的
public void asked(String str){
// 被问者2 的内心想法:
if("你有没有女朋友?".equals(str)){
// 敢这么问我,我就干死你
throw new RuntimeException();
}
}