这篇“如何解决Java异常”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何解决Java异常”文章吧。
写完代码后请一定要检查下,代码中千万不要有printStackTrace()
。因为printStackTrace()
只会在控制台上输出错误的堆栈信息,他只适合于用来代码调试。
真正需要记录异常,请使用日志记录。
catch (NoSuchMethodException e) { return null; }
永远不要不处理异常,而是返回 null,这样异常就会被吞掉,无法获取到任何失败信息,会给日后的问题排查带来巨大困难。
public void foo() throws Exception { //错误做法 }
一定要尽量避免上面的代码,因为他的调用者完全不知道错误的原因到底是什么。
在方法声明中,可以由方法抛出一些特定受检异常。如果有多个,那就分别抛出多个,这样这个方法的使用者才会分别针对每个异常做特定的处理,从而避免发生故障。
public void foo() throws SpecificException1, SpecificException2 { //正确做法 }
catch (NoSuchMethodException e) { throw e; //这代码一点用都没有 }
这是一个基本概念,当你能够处理他时,你再捕获这个异常,否则永远都不要捕获他。
如果你不能在catch
块中处理它,那么就不要先捕获再直接抛出,这样没有任何意义。
try { someMethod(); } catch (Exception e) { LOGGER.error("method has failed", e); }
以上代码,最大的问题就是,如果someMethod()
的开发者在里面新增了一个特定的异常,并且预期是调用方能够特殊的对他进行处理。
但是调用者直接catch
了Exception
类,就会导致永远无法知道someMethod
的具体变化细节。这久可能导致在运行的过程中在某一个时间点程序崩溃。
这是一个严重的问题,因为 Java 中的Error
也可以是Throwable
的子类。但是Error
是 Java 虚拟机本身无法控制的。Java 虚拟机甚至可能不会在出现任何错误时请求用户的catch
子句。
catch (NoSuchMethodException e) { throw new MyServiceException("Some information: " + e.getMessage()); //错误做法 }
上面的命令可能会丢失掉主异常的堆栈跟踪。正确的方法是:
catch (NoSuchMethodException e) { throw new MyServiceException("Some information: " , e); //正确做法 }
catch (NoSuchMethodException e) { LOGGER.error("Some information", e); throw e; }
如上面的代码所示,抛出和日志记录可能会在日志文件中产生多个日志消息。
这就会导致同一个问题,却在日志中有很多不同的错误信息,使得开发人员陷入混乱。
try { someMethod(); //抛出 exceptionOne } finally { cleanUp(); //如果在这里再抛出一个异常,那么try中的exceptionOne将会丢失forever }
在上面的例子中,如果someMethod()
抛出一个异常,并且在finally
块中,cleanUp()
也抛出一个异常,那么初始的exceptionOne
(正确的错误异常)将永远丢失。
try { someMethod(); } finally { cleanUp(); }
这也是一个很好的实践。如果在你的方法中访问其他方法,而该方法抛出了异常你不想处理,但是仍然需要做一些清理工作,那么在finally
块中进行清理。不要使用catch
块。
以上就是关于“如何解决Java异常”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。