【JavaSE】Java基础语法(二十五):异常

简介: 1. 异常异常的概述异常就是程序出现了不正常的情况

1. 异常

  • 异常的概述
    异常就是程序出现了不正常的情况


  • 异常的体系结构

5abc68fabcef46ebad02974c4b8be323.png

2. 编译时异常和运行时异常的区别

  • 编译时异常
  • 都是Exception类及其子类
  • 必须显示处理,否则程序就会发生错误,无法通过编译
  • 运行时异常
  • 都是RuntimeException类及其子类
  • 无需显示处理,也可以和编译时异常一样处理
  • 图示

ec006771aa3441a5ac3ae23f37c3fa20.png

3. JVM默认处理异常的方式

  • 如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:
  • 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
  • 程序停止执行

4. 查看异常信息

控制台在打印异常信息时,会打印异常类名,异常出现的原因,异常出现的位置

我们调bug时,可以根据提示,找到异常出现的位置,分析原因,修改异常代码

5. throws方式处理异常

  • 定义格式
public void 方法() throws 异常类名 {
}
  • 示例代码
public class ExceptionDemo {
  public static void main(String[] args) throws ParseException{
    System.out.println("开始");
    // method();
    method2();
    System.out.println("结束");
  }
  //编译时异常
  public static void method2() throws ParseException {
    String s = "2048-08-09";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date d = sdf.parse(s);
    System.out.println(d);
  }
  //运行时异常
  public static void method() throws ArrayIndexOutOfBoundsException {
    int[] arr = {1, 2, 3};
    System.out.println(arr[3]);
  }
}

注意事项

这个throws格式是跟在方法的括号后面的

编译时异常必须要进行处理,两种处理方案:try…catch …或者 throws,如果采用 throws 这种方案,在方法上进行显示声明,将来谁调用这个方法谁处理

运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处理

6. throw抛出异常

  • 格式
    throw new 异常();
  • 注意
    这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了
  • throws和throw的区别

62baa2a230204b59a60c8cc6b40d4101.png

  • 示例代码
public class ExceptionDemo8 {
  public static void main(String[] args) {
    //int [] arr = {1,2,3,4,5};
    int [] arr = null;
    printArr(arr);//就会 接收到一个异常.
    //我们还需要自己处理一下异常.
  }
  private static void printArr(int[] arr) {
    if(arr == null){
      //调用者知道成功打印了吗?
      //System.out.println("参数不能为null");
      throw new NullPointerException(); //当参数为null的时候
      //手动创建了一个异常对象,抛给了调用
      者,产生了一个异常
    }else{
      for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
      }
    }
  }
}

7 . try-catch方式处理异常

  • 定义格式
try {
  可能出现异常的代码;
} catch(异常类名 变量名) {
  异常的处理代码;
}
  • 执行流程
  • 程序从 try 里面的代码开始执行
  • 出现异常,就会跳转到对应的 catch 里面去执行
  • 执行完毕之后,程序还可以继续往下执行
  • 示例代码
public class ExceptionDemo01 {
  public static void main(String[] args) {
    System.out.println("开始");
    method();
    System.out.println("结束");
  }
  public static void method() {
    try {
      int[] arr = {1, 2, 3};
      System.out.println(arr[3]);
      System.out.println("这里能够访问到吗");
    } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("你访问的数组索引不存在,请回去修改为正确的索引");
    }
  }
}

注意

如果 try 中没有遇到问题,怎么执行?

会把try中所有的代码全部执行完毕,不会执行catch里面的代码

如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?

那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了

当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码

如果出现的问题没有被捕获,那么程序如何运行?

那么try…catch就相当于没有写.那么也就是自己没有处理.

默认交给虚拟机处理.

同时有可能出现多个异常怎么处理?

出现多个异常,那么就写多个catch就可以了.

注意点:如果多个异常之间存在子父类关系.那么父类一定要写在下面

8. Throwable成员方法(应用)

  • 常用方法

c4fa60a918444c79909bd1711e05f845.png

  • 示例代码
略。。。

9. 自定义异常(应用)

  • 自定义异常概述
    当Java中提供的异常不能满足我们的需求时,我们可以自定义异常
  • 实现步骤
    定义异常类
    写继承关系
    提供空参构造
    提供带参构造
  • 代码实现
public class AgeOutOfBoundsException extends RuntimeException {
  public AgeOutOfBoundsException() {
  }
  public AgeOutOfBoundsException(String message) {
  super(message);
  }
}
  • 使用
public void setAge(int age) {
  if(age >= 18 && age <= 25){
    this.age = age;
  }else{
    //如果Java中提供的异常不能满足我们的需求,我们可以使用自定义的异常
    throw new AgeOutOfBoundsException("年龄超出了范围");
  }
}


相关文章
|
25天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
48 1
|
23天前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
51 12
|
25天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
30 1
|
11天前
|
Java
java do while 的语法怎么用?
java do while 的语法怎么用?
28 3
|
26天前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
60 7
|
27天前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
55 6
|
1月前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
57 1
|
12天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
10天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
12天前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####