【码农每日一题】Java 异常(Part 3)相关面试题

467 阅读3分钟
关注一下嘛,又不让你背锅!

问:关于 java 中的异常处理你有啥心得或者经验?

答:这其实是一个经验题,答案不局限的,可以自由发挥,下面给出几个示例点。

  • 方法返回值尽量不要使用 null(特殊场景除外),这样可以避免很多 NullPointerException 异常。

  • catch 住了如果真的没必要处理则至少加行打印,这样可在将来方便排查问题。

  • 接口方法抛出的异常尽量保证是运行时异常类型,除非迫不得已才抛出检查类型异常。

  • 避免在 finally 中使用 return 语句或者抛出异常,如果调用的其他代码可能抛出异常则应该捕获异常并进行处理,因为 finally 中 return 不仅会覆盖 try 和 catch 内的返回值且还会掩盖 try 和 catch 内的异常,就像异常没有发生一样(特别注意,当 try-finally 中没有 return 时该方法运行会继续抛出异常)。

  • 尽量不要在 catch 块中压制异常(即什么也不处理直接 return),因为这样以后无论抛出什么异常都会被忽略,以至没有留下任何问题线索,如果在这一层不知道如何处理异常最好将异常重新抛出由上层决定如何处理异常。

  • 方法定义中 throws 后面尽量定义具体的异常列表,不要直接 throws Exception。

  • 捕获异常时尽量捕获具体的异常类型而不要直接捕获其父类,这样容易造成混乱。

  • 避免在 finally 块中抛出异常,不然第一个异常的调用栈会丢失。

  • 不要使用异常控制程序的流程,譬如本应该使用 if 语句进行条件判断的情况下却使用异常处理是非常不好的习惯,会严重影响性能。

  • 不要直接捕获 Throwable 类,因为 Error 是 Throwable 类的子类,当应用抛出 Errors 的时候一般都是不可恢复的情况。

当然还有其他的经验,上面只是给出一些常见的心得经验,具体回答时可自行拓展。

问:java 中 finally 块一定会执行吗?

答:不一定,分情况。因为首先想要执行 finally 块的前提是必须执行到了 try 块,当在 try 块或者 catch 块中有 System.exit(0); 这样的语句存在时 finally 块就不会被执行到了,因为程序被结束了。此外当在 try 块或者 catch 块里 return 时 finally 会被执行;而且 finally 块里 return 语句会把 try 块或者 catch 块里的 return 语句效果给覆盖掉且吞掉了异常。

问:java 中什么时候使用断言(assert)?

答:断言在开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性,断言检查通常在开发和测试时开启,为了保证程序的执行效率,在软件发布后断言检查通常是关闭的,断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true,如果表达式的值为 false 则系统会报告一个 AssertionError。

主人,别嫌短,长了你肯定不会看完的,所以这就是码农每日一题的宗旨~

看完分享一波嘛,和你的小伙伴一起讨论才更加有意思~

看个笑话放松一下

程序员爱情观:爱情就是死循环,一旦执行就陷进去了;爱上一个人,就是内存泄漏–你永远释放不了;真正爱上一个人的时候,那就是常量限定,永远不会改变;女朋友就是私有变量,只有我这个类才能调用;情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。

We always have time enough, if we will but use it aright.

只要我们能善用时间,就永远不愁时间不够用。