Java处理Exception的方法有哪些

技术Java处理Exception的方法有哪些这篇文章主要讲解了“Java处理Exception的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java处理Ex

本文主要讲解“Java中异常处理的方法有哪些”。本文的解释简单明了,易学易懂。接下来,请跟随边肖的思路学习《Java中异常处理的方法有哪些》!

00-1010当使用像InputStream这样在使用后需要关闭的资源时,一个常见的错误是在try块的末尾关闭资源。

public void doNotCloseResourceInTry(){ 0

file inputStream inputStream=null;

尝试{

文件文件=新文件('。/tmp . txt ');

inputStream=新文件inputStream(文件);

//使用inputStream读取文件

//不要这样做

inputstream . close();

} catch(FileNotFoundException e){ 0

log . error(e);

} catch(IOexception e){ 0

log . error(e);

}

}

当上面的代码运行时没有任何异常是没有问题的。但是,当try块中的语句引发异常或者由它自己实现的代码引发异常时,最后一条closing语句将不会被执行,资源也不会被释放。

合理的方法是将所有清理过的代码放入finally块中,或者使用try-with-resource语句。

public void closeresourceinfally(){ 0

file inputStream inputStream=null;

尝试{

文件文件=新文件('。/tmp . txt ');

inputStream=新文件inputStream(文件);

//使用inputStream读取文件

} catch(FileNotFoundException e){ 0

log . error(e);

}最后{

if (inputStream!=null){ 0

尝试{

inputstream . close();

} catch(IOexception e){ 0

log . error(e);

}

}

}

}

public void automatilyloseresource(){ 0

文件文件=新文件('。/tmp . txt ');

尝试(file inputStream inputStream=new file inputStream(文件);) {

//使用inputStream读取文件

} catch(FileNotFoundException e){ 0

log . error(e);

} catch(IOexception e){ 0

log . error(e);

}

}

00-1010尽可能使用最具体的异常来声明方法,这样可以让代码更容易理解。

public void doNotDoThis()引发异常{

.

}

public void doThis()引发NumberFormatException {

.

}

如上所述,NumberFormatException实际上可以看作是一个数字格式错误。

1. 在Finally块中清理资源或者使用try-with-resource语句

在方法上声明异常时,也需要文档。和前面一点一样,它是为了给调用者提供尽可能多的信息,以便更好地避免/处理异常。异常处理的10个最佳实践,也推荐这个。

在Javadoc中添加抛出声明,并描述抛出异常的场景。

/**

*这种方法非常有用.

*

* @param输入

* @在下列情况下抛出MyBusinessException.发生

*/

公共void doSomething(字符串

input) throws MyBusinessException {
...
}

 

 

4. 抛出异常的时候包含描述信息

在抛出异常时,需要尽可能精确地描述问题和相关信息,这样无论是打印到日志中还是监控工具中,都能够更容易被人阅读,从而可以更好地定位具体错误信息、错误的严重程度等。

但这里并不是说要对错误信息长篇大论,因为本来Exception的类名就能够反映错误的原因,因此只需要用一到两句话描述即可。

try {
new Long("xyz");
} catch (NumberFormatException e) {
log.error(e);
}

 

NumberFormatException即告诉了这个异常是格式化错误,异常的额外信息只需要提供这个错误字符串即可。当异常的名称不够明显的时候,则需要提供尽可能具体的错误信息。

 

5. 首先捕获最具体的异常

现在很多IDE都能智能提示这个最佳实践,当你试图首先捕获最笼统的异常时,会提示不能达到的代码。当有多个catch块中,按照捕获顺序只有第一个匹配到的catch块才能执行。因此,如果先捕获IllegalArgumentException,那么则无法运行到对NumberFormatException的捕获。

public void catchMostSpecificExceptionFirst() {
try {
doSomething("A message");
} catch (NumberFormatException e) {
log.error(e);
} catch (IllegalArgumentException e) {
log.error(e)
}
}

 

 

6. 不要捕获Throwable

Throwable是所有异常和错误的父类。你可以在catch语句中捕获,但是永远不要这么做。如果catch了throwable,那么不仅仅会捕获所有exception,还会捕获error。而error是表明无法恢复的jvm错误。因此除非绝对肯定能够处理或者被要求处理error,不要捕获throwable。

public void doNotCatchThrowable() {
try {
// do something
} catch (Throwable t) {
// don't do this!
}
}

 

 

7. 不要忽略异常

很多时候,开发者很有自信不会抛出异常,因此写了一个catch块,但是没有做任何处理或者记录日志。

public void doNotIgnoreExceptions() {
try {
// do something
} catch (NumberFormatException e) {
// this will never happen
}
}

 

但现实是经常会出现无法预料的异常或者无法确定这里的代码未来是不是会改动(删除了阻止异常抛出的代码),而此时由于异常被捕获,使得无法拿到足够的错误信息来定位问题。合理的做法是至少要记录异常的信息。

public void logAnException() {
try {
// do something
} catch (NumberFormatException e) {
log.error("This should never happen: " + e);
}
}
   

8. 不要记录并抛出异常

可以发现很多代码甚至类库中都会有捕获异常、记录日志并再次抛出的逻辑。如下:

try {
new Long("xyz");
} catch (NumberFormatException e) {
log.error(e);
throw e;
}

 

这个处理逻辑看着是合理的。但这经常会给同一个异常输出多条日志。如下:

17:44:28,945 ERROR TestExceptionHandling:65 - java.lang.NumberFormatException: For input string: "xyz"
Exception in thread "main" java.lang.NumberFormatException: For input string: "xyz"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:589)
at java.lang.Long.(Long.java:965)
at com.stackify.example.TestExceptionHandling.logAndThrowException(TestExceptionHandling.java:63)
at com.stackify.example.TestExceptionHandling.main(TestExceptionHandling.java:58)

 

如上所示,后面的日志也没有附加更有用的信息。如果想要提供更加有用的信息,那么可以将异常包装为自定义异常。

public void wrapException(String input) throws MyBusinessException {
try {
// do something
} catch (NumberFormatException e) {
throw new MyBusinessException("A message that describes the error.", e);
}
}

 

因此,仅仅当想要处理异常时才去捕获,否则只需要在方法签名中声明让调用者去处理。

9. 包装异常时不要抛弃原始的异常

捕获标准异常并包装为自定义异常是一个很常见的做法。这样可以添加更为具体的异常信息并能够做针对的异常处理。

需要注意的是,包装异常时,一定要把原始的异常设置为cause(Exception有构造方法可以传入cause)。否则,丢失了原始的异常信息会让错误的分析变得困难。

public void wrapException(String input) throws MyBusinessException {
try {
// do something
} catch (NumberFormatException e) {
throw new MyBusinessException("A message that describes the error.", e);
}
}

感谢各位的阅读,以上就是“Java处理Exception的方法有哪些”的内容了,经过本文的学习后,相信大家对Java处理Exception的方法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/127469.html

(0)

相关推荐

  • 化妆品牌子大全,日本有哪些好用的化妆品牌

    技术化妆品牌子大全,日本有哪些好用的化妆品牌日本女生从初中开始很多就开始化妆了化妆品牌子大全,所以整体国家的化妆品还是发展的很不错的,毕竟需求大嘛,而且从贵妇到大众品牌一应俱全,很多大集团都会出不同价位的品牌,以满足不同

    生活 2021年11月1日
  • python实现中心极限定理(用python求极限limit)

    技术Python怎么实现中心极限定律这篇文章主要讲解了“Python怎么实现中心极限定律”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么实现中心极限定律”吧

    攻略 2021年12月21日
  • 如何理解Process 执行命令行封装类

    技术如何理解Process 执行命令行封装类今天就跟大家聊聊有关如何理解Process 执行命令行封装类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。进行多次测试

    攻略 2021年11月12日
  • Java如何实现精美网上音乐平台

    技术Java如何实现精美网上音乐平台这篇文章主要介绍Java如何实现精美网上音乐平台,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、项目简述本系统功能包括: 音乐播放 用户登录注册 用户信息编辑

    攻略 2021年11月12日
  • 英文大小写26个字母,二十六个字母大小写小学英语

    技术英文大小写26个字母,二十六个字母大小写小学英语1、二十六个字母大小写书写顺序英文大小写26个字母:2、26个英文字母及发音音标如下: A a [ei] B b [bi:] C c [si:] D d [di:] E

    生活 2021年10月23日
  • 为什么应该选择美国服务器服务器租用美国

    技术为什么应该选择美国服务器服务器租用美国在海外服务器上搭建您的网站时,美国服务器都是您应该考虑的选项。以下是为什么应该选择美国服务器的原因专业技术支持 人们应该选择美国服务器租用服务的主要原因是它提供的技术支持。无论发

    礼包 2021年12月17日