我正在参加「启航计划」
咱们平常在写代码的时分常常会遇到这样的一种状况
提示说没有处理xxx反常
然后处理办法能够在外面加上try-catch
,就像这样
所以我之前常常这样处理
//重新抛出 RuntimeException
public class ThrowsDemo {
public void demo4throws() {
try {
new ThrowsSample().sample4throws();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//打印日志
@Slf4j
public class ThrowsDemo {
public void demo4throws() {
try {
new ThrowsSample().sample4throws();
} catch (IOException e) {
log.error("sample4throws", e);
}
}
}
//继续往外抛,可是需求每个办法都增加 throws
public class ThrowsDemo {
public void demo4throws() throws IOException {
new ThrowsSample().sample4throws();
}
}
可是我一直不明白
这个办法为什么不直接帮我做
反而要让我许多余的加上一步
我处理和它处理有什么区别吗?
而且变的好不美观
原本缩进就多,现在加个try-catch
更是火上浇油
public class ThrowsDemo {
public void demo4throws() {
try {
if (xxx) {
try {
if (yyy) {
} else {
}
} catch (Throwable e) {
}
} else {
}
} catch (IOException e) {
}
}
}
上面的代码,就算里边没有事务,看起来也现已比较乱了,分不清哪个括号和哪个括号是一对
还有就是对Lambda
很不友好
没有办法直接用::
来优化代码,所以就变成了下面这样
原本看起来很简略很舒服的Lambda
,现在又变得又臭又长
为什么会强制 try-catch
为什么咱们平常写的办法不需求强制try-catch
,而许多jdk
中的办法却要呢
那是由于那些办法在办法的界说上增加了throws
关键字,而且后边跟的反常不是RuntimeException
一旦你显式的增加了这个关键字在办法上,同时后边跟的反常不是RuntimeException
,那么运用这个办法的时分就必须要显示的处理
比方运用try-catch
或者是给调用这个办法的办法也增加throws
以及对应的反常
throws 是用来干什么的
那么为什么要给办法增加throws
关键字呢?
给办法增加throws
关键字是为了表明这个办法可能会抛出哪些反常
就像一个风险告知
这样你在看到这个办法的界说的时分就一望而知了:这个办法可能会呈现什么反常
为什么 RuntimeException 不强制 try-catch
那为什么RuntimeException
不强制try-catch
呢?
由于许多的RuntimeException
都是由于程序的BUG
而产生的
比方咱们调用Integer.parseInt("A")
会抛出NumberFormatException
当咱们的代码中呈现了这个反常,那么咱们就需求修正这个反常
当咱们修正了这个反常之后,就不会再抛出这个反常了,所以try-catch
就没有必要了
当然像下面这种代码除外
public boolean isInteger(String s) {
try {
Integer.parseInt(s);
return true;
} catch (NumberFormatException e) {
return false;
}
}
这是咱们利用这个反常来达到咱们的需求,是有意为之的
而另外一些反常是归于没办法用代码处理的反常,比方IOException
咱们在进行网络恳求的时分就有可能抛出这类反常
由于网络可能会呈现不稳定的状况,而咱们对这个状况是无法干涉的
所以咱们需求提前考虑各种突发状况
强制try-catch
相当于直接的确保了程序的健壮性
究竟咱们平常写代码,假如IDE
没有提示反常处理,咱们彻底不会认为这个办法会抛出反常
我的代码怎样可能有问题!
throws 和 throw 的区别
java
中还有一个关键词throw
,和throws
只有一个s
的不同
throw
是用来自动抛出一个反常
public class ThrowsDemo {
public void demo4throws() throws RuntimeException {
throw new RuntimeException();
}
}
两者彻底是不同的功用,大家不要弄错了
什么场景用 throws
咱们能够发现咱们平常写代码的时分其实很少运用throws
由于当咱们在开发事务的时分,一切的分支都现已确定了
比方网络恳求呈现反常的时分,咱们常用的办法可能是打印日志,或是进行重试,把反常往外抛等等
所以咱们没有那么有必要去运用throws
这个关键字来说明反常信息
可是当咱们没有办法确定反常要怎样处理的时分呢?
比方我在GitHub
上保护了一个功用库,自身没有什么事务特点,主要就是对于一些复杂的功用做了相应的封装,提供给自己或他人运用(假如有兴趣能够看看我的库,顺便给Star,嘿嘿)
对我来说,当我的办法中呈现反常时,我是不清楚调用这个办法的人是想要怎样处理的
可能有的想要重试,有的想要打印日志,那么我爽性就往外抛,让调用办法的人自己去考虑,自己去处理
所以简略来说,假如办法主要是给他人用的最好用throws
把反常往外抛,反之就是可加可不加
完毕
许多时分你的不理解只是由于你还不够了解