`
tianlihu
  • 浏览: 314015 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

Java 常见的误用异常处理

阅读更多
原文链接

●空catch语句块
  犯这种错误的人比较少,一般发生在刚学会Java或者刚参加工作不久的人身上。
  所谓"空catch语句块"就是在catch语句块中没有对异常作任何log处理,导致异常信息被丢弃掉。一旦程序不能正确运行,由于查不到任何log信息,只好从头看代码,靠肉眼找bug。

●没有使用finally
  很多人在catch语句之后不使用finally语句。由于在try语句中可能会涉及资源的申请和释放。如果在资源申请之后、资源释放之前抛出异常,就会发生资源泄露

●笼统的catch语句块finally
  有些人为了省事,只在自己模块的最外层代码包一个try语句块,然后catch(Exception)。不管捕获到什么异常,都作统一log了事。这种做法比“空catch语句块”稍好,但由于不能对具体的异常进行具体处理,对一些可恢复的异常(下面会提到),丧失了恢复的机会。而且也可能导致上述提到的资源泄露的问题。

●使用函数返回值进行错误处理
  有些人放着Java的异常机制不用,而用函数返回值来表示成功/失败(比如返回true表示成功、返回false表示失败),简直是“捧着金碗要饭”。个人感觉,从C转到Java的人比较容易有此毛病。这种做法会导致如下几个问题:
  返回值一般用整数值或布尔值表示,传递的信息过于简陋;
  一旦调用者忽略了错误返回码,就会导致和“空catch语句块”类似的问题;
  对同一个函数的多处调用,都需要对返回值进行重复判断,导致代码冗余

●不清楚Checked Exception和Runtime Exception的区别
  这个现象比较普遍,我发现很多2年以上Java工作经验的人尚未完全搞明白两者的区别。看来这个问题得详细说一下。
  当初Java的设计者有意区分这两种异常,是别有深意的。其中“Checked Exception”用于表示可恢复的异常(也就是你必须检查的异常);而“Runtime Exception”表示不可恢复的异常(也就是运行时异常,主要是程序bug和致命错误,你不需要检查)。不过这种做法引来了很多争议(包括很多Java大牛),鉴于本帖子主要针对新手,以后再专门来聊这个争议的话题。
  为了便于理解,下面我举一个例子来说明。假设你要写一个Download函数,根据传入的URL(String参数)返回对应网页的内容文本。这时候有两种情况你需要处理:
  1、如果传入的URL参数是null,这表明该函数的调用者出bug了,而程序本身的bug是很难在运行时自我恢复的。这时候Download函数必须抛出Runtime Exception。并且Download函数的调用者不应该捕获这个异常,必须让它立即暴露出来(比如让JVM自己终止运行)。
  2、如果传入的URL参数非null,但是它包含的字符串不是一个合法的URL格式(可能由于用户输入错误导致)。这时候Download函数必须抛出 Checked Exception。并且Download函数的调用者必须捕获该异常并进行相应的处理(比如提示用户重新输入URL)。

  上面就是几种常见的Java异常处理的误用。
分享到:
评论

相关推荐

    Java 编程 :常见问题汇总

    2. **空指针异常:** 空指针异常是在Java中非常常见的错误之一。为了避免这类异常,应当养成良好的编程习惯,如使用`Objects.requireNonNull()`方法检查参数是否为`null`。 ```java public void method(Object ...

    Java Bug模式详解 pdf版

    6. **异常处理**:异常处理是Java编程中重要的一环,书中会介绍如何编写有效的异常处理代码,避免使用空的catch块,以及何时使用checked和unchecked异常。 7. **内存泄漏**:Java的垃圾回收机制虽然可以自动管理...

    Java the Good Parts

    - 异常处理的正确使用方式与常见误用。 - 异常处理可能带来的负面影响。 4. **包(Package)机制** - 包的基本概念与作用。 - 包如何实现访问控制。 - 包的实际应用场景示例。 - 包与文件系统的关系。 5. **...

    常见的java面试题集

    1. **异常处理机制**:Java中的异常处理机制是基于面向对象的设计,当程序违反了Java的语义规则时,如数组越界、空指针访问等,Java虚拟机会抛出异常。异常是`java.lang.Throwable`类的子类,分为Error和Exception两...

    java编程规范与常见问题

    6. **异常处理**:事件用于广播消息,通知关注者发生了某些情况,如库存变化。异常则是程序执行过程中遇到的问题,应该被捕获并妥善处理。每个方法都应有处理未预期异常的 `catch` 块,确保程序的健壮性。 7. **...

    Java基础方面陷阱.

    综上所述,Java基础方面的陷阱涵盖了语法理解、数据类型使用、运算符和流程控制的误用、异常处理的不当、内存管理的误区,以及面向对象设计原则的应用等多个方面。通过深入学习和实践,可以有效地避免这些陷阱,提升...

    java面试题目精选

    - **易犯错误的关键字**:列出了一些容易被误用的Java关键字。 - **注释的使用**:介绍了不同类型的注释及其在代码中的作用。 - **3.2 原始类型** - **int与Integer的区别**:解释了int作为基本类型与Integer...

    Java常见基础知识点.md

    - **异常处理**:Java强制要求捕获或声明异常,这有助于编写健壮的程序。C++的异常处理机制是可选的。 - **性能比较**:一般来说,C++的执行效率高于Java,因为它不依赖于虚拟机。 #### JVM、JDK和JRE的区别 - **...

    Java开发手册.zip

    这份手册包含了丰富的Java编程规范、最佳实践以及常见问题解决方案,是Java程序员日常工作中不可或缺的参考文档。 1. **编程规范**:手册详细规定了Java代码的命名规则、注释规范、代码格式化等,如类名使用驼峰式...

    JAVA编写的一个小型员工管理系统

    2. **异常处理**:JAVA程序中应妥善处理可能出现的异常,如空指针异常(NullPointerException)、数组越界异常(ArrayIndexOutOfBoundsException)等。未正确捕获和处理异常可能导致程序崩溃。 3. **对象生命周期**...

    Java.Bug模式详解pdf

    3. **异常处理不当**:异常处理是Java编程的重要组成部分,但错误的异常处理可能导致程序崩溃或隐藏错误。书中可能会讨论如何合理地使用try-catch-finally,避免空指针异常、数组越界异常等常见问题。 4. **集合...

    骑士飞行棋(java源代码)

    6. 异常处理:Java的异常处理机制可以帮助开发者处理运行时错误,保证程序的稳定运行。 7. 文件操作:可能需要保存和加载游戏进度,Java的I/O流可以实现这一点。 8. 用户输入:通过Scanner类获取用户的命令或骰子...

    “使用元编程为空指针异常生成动态补丁”(SANER'17)中描述的程序修复工具的开放科学代码_Java_Python_下.zip

    因此,NPEFix可能也提供了针对Python的解决方案,尽管Python的异常处理机制和Java有所不同。 总的来说,这个工具为开发者提供了一种自动化手段来解决空指针异常问题,提高了代码的健壮性和可靠性。通过研究和使用...

    Java解惑 随书源代码

    3. **异常处理**:Java中异常处理是一个重要的主题,书中可能涉及了如何有效地捕获和处理异常,以及如何避免异常处理中的常见错误。 4. **内存管理**:Java的垃圾收集机制可能导致一些不易察觉的问题,如内存泄漏。...

    JavaJava%BEE软件工程师就业求职手册.doc

    - **6.2.1 理解Java的异常类**:介绍Java异常处理机制的核心概念,包括异常类的层次结构、异常抛出与捕获机制等。 - **6.2.2 深入理解异常**:深入探讨了如何有效地处理异常,包括自定义异常类的创建、异常链等...

    java解惑 - 最后的笑声

    1. **异常处理**:Java中的异常处理是程序稳定性的关键。文章可能会讨论如何正确地使用`try-catch-finally`块,以及何时应抛出和捕获特定类型的异常。异常的滥用可能导致代码难以阅读和维护,因此理解异常的分类和...

    最新版javajdk8文档

    7. **新的集合工厂方法**:Java 8在集合接口中添加了工厂方法,如`List.of()`、`Set.of()`和`Map.of()`, 可以方便地创建不可变集合,避免了常见的空构造器和add方法的误用。 8. **接口的私有方法和静态方法**:Java...

    java utils 工具类

    - **异常处理**:提供合理的异常处理策略,避免抛出未经检查的异常。 ### 5. 示例代码分析 ```java public class ProcessUtil { private ProcessUtil() { throw new AssertionError("Cannot instantiate object ...

    Java编程最差实践

    7. **不恰当的异常处理**: - 错误做法:不加思考地使用`catch (Exception e)`,这会隐藏潜在的问题并阻碍调试。 - 改进:应该尽可能捕获特定类型的异常,并给出适当的处理,或者至少记录详细的异常信息。 8. **...

Global site tag (gtag.js) - Google Analytics