首页 > 编程语言 >Java【异常处理】

Java【异常处理】

时间:2024-09-13 15:51:22浏览次数:11  
标签:Java 处理 抛出 代码 try catch 异常 public

机制概述

JVM用方法调用栈来跟踪一系列方法的调用过程,位于栈顶的是正在执行的方法,当一个方法抛出异常时,根据代码处理异常。

异常常见类型 

  • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这些异常在编译时强制要求程序员处理。
  • 运行时异常: 这些异常在编译时不强制要求处理,通常是由程序中的错误引起的,例如 NullPointerException、ArrayIndexOutOfBoundsException 等,这类异常可以选择处理,但并非强制要求。
  • 错误: 错误不是异常,而是脱离程序员控制的问题,错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。


语法

异常处理的关键字和类

  • try:用于包裹可能会抛出异常的代码块。
  • catch:用于捕获异常并处理异常的代码块。
  • finally:用于包含无论是否发生异常都需要执行的代码块。
  • throw:用于手动抛出异常。
  • throws:用于在方法声明中指定方法可能抛出的异常。
  • Error类:是程序无法处理的错误,表示应用程序运行时环境发生的中的错误。如JVM 内存溢出。
  • Exception类:是程序本身可以处理的异常,可以分为运行时异常或编译异常,它提供了一些方法来获取异常信息。

try-catch捕获异常

使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

try {

    // 程序代码

}catch(ExceptionName e1) {

    //Catch 块

}

Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数的方法是一样。

示例:

// 文件名 : ExcepTest.java
import java.io.*;
public class ExcepTest{
   //有两个元素的一个数组,当代码试图访问数组的第三个元素的时候就会抛出一个异常。
   public static void main(String args[]){
      try{
         int a[] = new int[2];
         System.out.println("Access element three :" + a[2]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

多重捕获块

try{
   // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}catch(异常类型3 异常的变量名3){
  // 程序代码
}

示例:

try {
   //创建一个 FileInputStream 对象,用于从名为 fileName 的文件中读取数据
   file = new FileInputStream(fileName); 
   //调用 read() 方法从文件中读取一个字节的数据,并将其强制转换为 byte 类型,存储在变量 x 中
   x = (byte) file.read();
} catch(FileNotFoundException f) { //指定的文件不存在
   f.printStackTrace();
   return -1;
} catch(IOException i) { //在读取文件时发生其他 I/O 错误
   i.printStackTrace();
   return -1;
}

throw/throws处理异常

throw 关键字用于在代码中抛出异常,而 throws 关键字用于在方法声明中指定可能会抛出的异常类型。

示例:

//判断 num 是否小于 0,如果是,则抛出一个 IllegalArgumentException 异常
public void checkNumber(int num) {
  if (num < 0) {
    throw new IllegalArgumentException("Number must be positive");
  }
}
//当 readFile 方法内部发生 IOException 异常时,会将该异常传递给调用该方法的代码
public void readFile(String filePath) throws IOException {
  BufferedReader reader = new BufferedReader(new FileReader(filePath));
  String line = reader.readLine();
  while (line != null) {
    System.out.println(line);
    line = reader.readLine();
  }
  reader.close();
}

throw和throws的区别:

throw指人为地抛出一个异常对象,throws在方法上声明使用,表示这些方法将给被调处处理。throw出现在函数体,throws出现在方法函数头。执行throw一定出现了某种异常,而throws表示出现异常一种可能性,不一定会发生异常。两者都是消极方式,只是抛出异常,不会处理异常,真正处理异常由函数的上层调用完成。

finally关键字

finally 用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。finally 代码块出现在 catch 代码块最后,在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。try 代码后不能既没 catch 块也没 finally 块。

try{
  // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}finally{
  // 程序代码
}

示例:

public class ExcepTest{
  public static void main(String args[]){
    int a[] = new int[2];
    try{
       System.out.println("Access element three :" + a[3]);
    }catch(ArrayIndexOutOfBoundsException e){
       System.out.println("Exception thrown  :" + e);
    }
    finally{
       a[0] = 6;
       System.out.println("First element value: " +a[0]);
       System.out.println("The finally statement is executed");
    }
  }
}

try-with-resource 语法结构

JDK7后新增的。try-with-resources 机制旨在自动管理资源,确保资源在使用后能够及时关闭,避免资源泄露 。它能够自动关闭在 try 块中声明的资源,无需显式地在 finally 块中关闭。在 try-with-resources 语句中,只需要在 try 关键字后面声明资源,然后跟随一个代码块。无论代码块中的操作是否成功,资源都会在 try 代码块执行完毕后自动关闭。

try (resource declaration) {
  // 使用的资源
} catch (ExceptionType e1) {
  // 异常块
}

示例:

import java.io.*;

public class RunoobTest {

    public static void main(String[] args) {
    //声明一个字符串变量 line,用于存储读取的每一行内容
    String line;
        //使用 try-with-resources 语句创建一个 BufferedReader 对象 br,用于读取文件 test.txt
        try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
            //使用 while 循环逐行读取文件内容。readLine() 方法返回当前行的内容,如果到达文件末尾,将返回 null
            while ((line = br.readLine()) != null) {
                System.out.println("Line =>"+line);
            }
        } catch (IOException e) { //捕获可能出现的 IOException
            //打印异常信息
            System.out.println("IOException in try block =>" + e.getMessage());
        }
    }
}


异常类

Java 的非检查性异常类

异常描述
ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
ArrayIndexOutOfBoundsException用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。
ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常。
IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数。
IllegalMonitorStateException抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
IllegalStateException在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
IllegalThreadStateException线程没有处于请求操作所要求的适当状态时抛出的异常。
IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
NegativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。
NullPointerException当应用程序试图在需要对象的地方使用 null 时,抛出该异常
NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
SecurityException由安全管理器抛出的异常,指示存在安全侵犯。
StringIndexOutOfBoundsException此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
UnsupportedOperationException当不支持请求的操作时,抛出该异常。

Java的检查性异常类

异常描述
ClassNotFoundException应用程序试图加载类时,找不到相应的类,抛出该异常。
CloneNotSupportedException当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
IllegalAccessException拒绝访问一个类的时候,抛出该异常。
InstantiationException当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
InterruptedException一个线程被另一个线程中断,抛出该异常。
NoSuchFieldException请求的变量不存在
NoSuchMethodException请求的方法不存在


自定义异常

规则

  • 所有异常都必须是 Throwable 的子类。
  • 如果希望写一个检查性异常类,则需要继承 Exception 类。
  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

Throwable 类的主要方法

序号方法及说明
1public String getMessage()
返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。
2public Throwable getCause()
返回一个 Throwable 对象代表异常原因。
3public String toString()
返回此 Throwable 的简短描述。
4public void printStackTrace()
将此 Throwable 及其回溯打印到标准错误流。
5public StackTraceElement [] getStackTrace()
返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。
6public Throwable fillInStackTrace()
用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。

示例:

// 文件名称 CheckingAccount.java
import java.io.*;
 
//此类模拟银行账户
public class CheckingAccount
{
  //balance为余额,number为卡号
   private double balance;
   private int number;
   public CheckingAccount(int number)
   {
      this.number = number;
   }
  //方法:存钱
   public void deposit(double amount)
   {
      balance += amount;
   }
  //方法:取钱
   public void withdraw(double amount) throws
                              InsufficientFundsException
   {
      if(amount <= balance)
      {
         balance -= amount;
      }
      else
      {
         double needs = amount - balance;
         throw new InsufficientFundsException(needs);
      }
   }
  //方法:返回余额
   public double getBalance()
   {
      return balance;
   }
  //方法:返回卡号
   public int getNumber()
   {
      return number;
   }
}

标签:Java,处理,抛出,代码,try,catch,异常,public
From: https://blog.csdn.net/weixin_74417251/article/details/141933439

相关文章

  • java父类、子类构造函数调用过程
    java父类、子类构造函数调用过程由此看出java类初始化时构造函数调用顺序:初始化对象的存储空间为零或null值;按顺序分别调用父类成员变量和实例成员变量的初始化表达式;调用父类构造函数;(如果实用super()方法指定具体的某个父类构造函数则使用指定的那个父类构造函数)按顺序分别......
  • Java21的虚拟线程来了
    1、什么是平台线程?平台线程是作为操作系统(OS)线程的薄包装器实现的。平台线程在其底层OS线程上运行Java代码,并且平台线程在其整个生命周期内捕获其OS线程。因此,可用的平台线程数量受限于OS线程的数量。平台线程通常具有较大的线程堆栈和由操作系统维护的其他资源。它们......
  • 面试官:线程池遇到未处理的异常会崩溃吗?
    首先,这个问题考察的是你对线程池execute方法和submit方法的理解,在Java线程池的使用中,我们可以通过execute方法或submit方法给线程池添加任务,但如果线程池中的程序在执行时,遇到了未处理的异常会怎么呢?接下来我们一起来看。1.execute方法execute方法用于提交一个不需要......
  • JAVA时间转换总结
    JAVA时间转换总结 1.格式化时间Date~2022-03-2403:30:13SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");StringdateStr=format.format(newDate());2.格式化时间2022-03-24T03:30:13.000000~2022-03-2403:30:13......
  • java基础之继承
     1.一个子类只能有一个直接父类(一个父类可以多个子类)2.private修饰符和void不能继承、不同包不能继承代码如下: 父类packagebegan;//定义一个父类publicclassPet01{//属性publicStringname;//方法publicvoidrun(Stringname){Sy......
  • java+vue计算机毕设城市共享汽车资源管理App【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和居民出行需求的日益增长,城市交通拥堵、环境污染等问题日益凸显。共享经济的兴起为解决这些问题提供了新思路,其中城市共享汽车......
  • java+vue计算机毕设出租车管理系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,出租车作为城市公共交通体系的重要组成部分,其运营效率与服务质量直接关系到市民的日常出行体验及城市形象。然而,传统出租车管理......
  • java+vue计算机毕设大学生互联网项目管理信息系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,大学生参与科研项目与创新创业活动的热情日益高涨。然而,传统的项目管理方式往往依赖于纸质文档和人工协调,不仅效率低下,还容......
  • 基于Java+Springboot+Vue开发的体育场馆预约管理系统
    项目简介该项目是基于Java+Springboot+Vue开发的体育场馆预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的体育场馆管理系统项目,大学生可以在实践中学习和提......
  • 基于Java+Springboot+Vue开发的旅游景区管理系统
    项目简介该项目是基于Java+Springboot+Vue开发的旅游景区管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的旅游景区管理系统项目,大学生可以在实践中学习和提升自......