网站移动端推广佛山网站建设熊掌号
news/
2025/10/8 17:33:27/
文章来源:
网站移动端推广,佛山网站建设熊掌号,哪有备案好的网站,图片文字制作只针对不正常的情况才使用异常 异常只应该被用于不正常的条件#xff0c;它们永远不应该被用于正常的控制流。《阿里手册》中#xff1a;【强制】Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理#xff0c;比如#xff1a;Nu…只针对不正常的情况才使用异常 异常只应该被用于不正常的条件它们永远不应该被用于正常的控制流。《阿里手册》中【强制】Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理比如NullPointerExceptionIndexOutOfBoundsException等等。 比如在解析字符串形式的数字时可能存在数字格式错误不得通过catch Exception来实现
代码1
if (obj ! null) {//...
}代码2
try { obj.method();
} catch (NullPointerException e) {//...
}主要原因有三点
异常机制的设计初衷是用于不正常的情况所以很少会会JVM实现试图对它们的性能进行优化。所以创建、抛出和捕获异常的开销是很昂贵的。把代码放在try-catch中返回阻止了JVM实现本来可能要执行的某些特定的优化。对数组进行遍历的标准模式并不会导致冗余的检查有些现代的JVM实现会将它们优化掉
在 finally 块中清理资源或者使用 try-with-resource 语句
当使用类似InputStream这种需要使用后关闭的资源时一个常见的错误就是在try块的最后关闭资源。
错误示例 public void doNotCloseResourceInTry() {FileInputStream inputStream null;try {File file new File(./tmp.txt);inputStream new FileInputStream(file);// use the inputStream to read a file// do NOT do thisinputStream.close();} catch (FileNotFoundException e) {log.error(e);} catch (IOException e) {log.error(e);}
} 问题就是只有没有异常抛出的时候这段代码才可以正常工作。try 代码块内代码会正常执行并且资源可以正常关闭。但是使用 try 代码块是有原因的一般调用一个或多个可能抛出异常的方法而且你自己也可能会抛出一个异常这意味着代码可能不会执行到 try 代码块的最后部分。结果就是你并没有关闭资源。 所以你应该把清理工作的代码放到 finally 里去或者使用 try-with-resource 特性。 方法一使用 finally 代码块 与前面几行 try 代码块不同finally 代码块总是会被执行。不管 try 代码块成功执行之后还是你在 catch 代码块中处理完异常后都会执行。因此你可以确保你清理了所有打开的资源。 public void closeResourceInFinally() {FileInputStream inputStream null;try {File file new File(./tmp.txt);inputStream new FileInputStream(file);// use the inputStream to read a file} catch (FileNotFoundException e) {log.error(e);} finally {if (inputStream ! null) {try {inputStream.close();} catch (IOException e) {log.error(e);}}}
} 方法二Java 7 的 try-with-resource 语法 如果你的资源实现了 AutoCloseable 接口你可以使用这个语法。大多数的 Java 标准资源都继承了这个接口。当你在 try 子句中打开资源资源会在 try 代码块执行后或异常处理后自动关闭。 public void automaticallyCloseResource() {File file new File(./tmp.txt);try (FileInputStream inputStream new FileInputStream(file);) {// use the inputStream to read a file} catch (FileNotFoundException e) {log.error(e);} catch (IOException e) {log.error(e);}
} 尽量使用标准的异常 代码重用是值得提倡的这是一条通用规则异常也不例外。 重用现有的异常有几个好处
它使得你的API更加易于学习和使用因为它与程序员原来已经熟悉的习惯用法是一致的。对于用到这些API的程序而言它们的可读性更好因为它们不会充斥着程序员不熟悉的异常。异常类越少意味着内存占用越小并且转载这些类的时间开销也越小。
Java标准异常中有几个是经常被使用的异常。如下
异常使用场合IllegalArgumentException参数的值不合适IllegalStateException参数的状态不合适NullPointerException在null被禁止的情况下参数值为nullIndexOutOfBoundsException下标越界ConcurrentModificationException在禁止并发修改的情况下对象检测到并发修改UnsupportedOperationException对象不支持客户请求的方法 虽然它们是Java平台库迄今为止最常被重用的异常但是在许可的条件下其它的异常也可以被重用。例如如果你要实现诸如复数或者矩阵之类的算术对象那么重用ArithmeticException和NumberFormatException将是非常合适的。如果一个异常满足你的需要则不要犹豫使用就可以不过你一定要确保抛出异常的条件与该异常的文档中描述的条件一致。这种重用必须建立在语义的基础上而不是名字的基础上。
最后一定要清楚选择重用哪一种异常并没有必须遵循的规则。例如考虑纸牌对象的情形假设有一个用于发牌操作的方法它的参数(handSize)是发一手牌的纸牌张数。假设调用者在这个参数中传递的值大于整副牌的剩余张数。那么这种情形既可以被解释为IllegalArgumentException(handSize的值太大)也可以被解释为IllegalStateException(相对客户的请求而言纸牌对象的纸牌太少)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931767.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!