好程序员Java教程系列之异常定义

简介:

好程序员Java教程分享Java系列之异常定义

异常定义

异常:就是程序在运行的过程中遇到的种种不正常的情况。

特点:如果一个程序在运行中遇到了一个未经处理的异常,则这个异常会终止程序的运行。

​ 但是如果程序出现的异常被处理了,此时程序不会被终止。所以我们需要知道怎么去处理异常。

其实在Java中,异常也是一个类。

类的体系:

  • Throwable: 是所有的异常的根类

    • Error: 发生在编译器级别的,我们程序无法处理的错误。
    • Exception: 我们可以去处理的异常。

      • RuntimeException:

异常的分类:可以分成两种异常:

  • 运行时异常(Runtime Exception)

    • 发生在程序运行的过程中的异常。
    • 如果不处理这种异常,程序可以正常编译,但是当执行到异常产生的时候,会终止程序的运行。
    • 例如:NullPointerException、IndexOutOfBoundsException、ArithmeticException...
  • 非运行时异常(Non-Runtime Exception)

    • 发生在程序编译的过程中的异常。(编译时异常)
    • 如果不处理这种异常,程序将无法进行编译。
    • 例如:ParseException...

常用结构

需要使用语法:try-catch-finally

语法:

try {

​ // 这里写可能会产生异常的代码。

​ // 注意:

​ // 一旦这里面的代码产生了异常,从异常产生开始往后所有try中的代码都不再执行,直接执行指定的catch

}

catch(需要捕获的异常类型 标识符) {

​ // 捕获异常,如果try中产生的异常类型和我们要捕获的异常类型匹配,此时会执行这个代码段中的内容

​ // 如果执行到这里了,相当于这个异常被捕获、处理了,这个异常将不再终止程序的运行。

}

finally {

​ // 这里的代码始终会执行。

​ // 无论try中的代码有没有异常产生,这里的代码都会执行。

​ // 在这里我们一般情况下是做一些资源释放的工作。

}

备注:

  1. 以上,是完整的try-catch-finally语句。但是实际在用的时候,try后面可以只有catch, 也可只有finally,但是不能什么都没有。
  2. 一般情况下,catch我们是不会省略不写的。
  3. 如果try中的代码可能产生的异常不止一种

    1. 如果需要对产生的不同异常进行不同的处理,可以使用多个catch语句

      1. 多个catch语句的先后顺序

        1. 如果多个catch中的异常,没有继承关系,则先后顺序没有影响
        2. 如果多个catch中的异常,有继承关系,则子类异常在前,父类异常在后
    2. 如果需要对某些异常做同样的处理,可以在同一个catch中,用 | 拼接所有要处理的异常。

      1. 这些用|拼接起来的异常之间,不能有继承关系
    3. 如果需要对所有的异常做同样的处理,可以在一个catch中捕获一个父类异常。
public static int show(int a, int b) {
    int c = 0;
    try {
        c = a / b;
        // 能走到这里,说明上面的除没有异常。
        return c;
    }
    catch (ArithmeticException e) {
        System.out.println("出现了一个算术异常");
        return c;
    }
    finally {
        // 在return之前,执行finally中的代码段
        System.out.println("finally中的代码执行了");
        c = -10;
    }
}

以上代码段,在try和catch中都有return语句。

finally中的代码始终会执行,但是针对这种情况,他的执行时机:

先执行return语句,此时,将需要返回的值缓存起来。然后再去执行finally语句中的代码,执行结束后,返回刚才缓存的那个值。

finally关键字的应用

throw和throws关键字

throw:

常用在某一个方法中,表示抛出一个异常对象。等在调用这个方法的时候去处理这个异常。

一个异常对象被实例化完成后,不具备任何意义。只有被throw关键字抛出了,才具备异常的功能。

throws:
  1. 常用在方法的声明部分,用来描述这个方法可能会抛出什么异常,给调用这个方法的部分看的。

    • 如果在方法中使用throw抛出了一个Runtime Exception:

      • throws可以写,也可以不写
      • 备注:一般情况下,我们还是会按照实际情况进行描述的。
    • 如果在方法中使用throw抛出了一个Non-Runtime Exception:

      • 此时throws必须写
  2. 可以在方法中不去处理异常,将异常处理提到调用这个方法的时候。

注意:在方法重写中

  1. 如果重写的方法抛出的是一个Non-Runtime Exception

    1. 子类方法抛出的异常需要父类方法抛出异常的子类型,或者等同于父类方法抛出的异常类型
    2. 不能让子类重写的方法抛出异常的类型高于父类方法抛出的异常类型

自定义异常

系统给我们提供了很多的异常类,但是这些异常类并不能够满足我们所有的需求。这种情况下,我们就需要去自定义异常。继承自异常类,写一个子类即可。

  1. 自定义RuntimeException

    1. 继承自RuntimeException类,写一个子类。这个子类异常就是一个运行时异常。

      class NumberOfLegException extends RuntimeException {
          /**
           * 通过一个异常描述信息来实例化一个异常对象
           * @param message
           */
          public NumberOfLegException(String message) {
              // 怎么样去设置这个异常信息?
              super(message);
          }
      }
  2. 自定义Non-Runtime Exception

    1. 继承自Exception类,写一个子类。这个子类异常就是一个非运行时异常。

      class NumberOfLegException extends Exception {
          /**
           * 通过一个异常描述信息来实例化一个异常对象
           * @param message
           */
          public NumberOfLegException(String message) {
              // 怎么样去设置这个异常信息?
              super(message);
          }
      }

在自定义异常类的时候,类名最好使用Exception作为结尾

相关文章
|
10天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
33 9
|
5天前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
2天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
9 2
|
5天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
5天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
5天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
9天前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
|
7天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
12天前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
18 5
|
12天前
|
存储 安全 Java
如何避免 Java 中的“ArrayStoreException”异常
在Java中,ArrayStoreException异常通常发生在尝试将不兼容的对象存储到泛型数组中时。为了避免这种异常,确保在操作数组时遵循以下几点:1. 使用泛型确保类型安全;2. 避免生类型(raw types)的使用;3. 在添加元素前进行类型检查。通过这些方法,可以有效防止 ArrayStoreException 的发生。