Java的Try_Catch

Java中的Try_Catch

​ 在 Java 中,trycatch 是用于异常处理的关键字。它们的主要作用是++捕获和处理++在程序运行中可能发生的异常,以防止程序崩溃。

  • 日常学习中,可以检查并捕获自己代码的错误信息
  • 在开发过程中,适当的异常处理可以帮助您更快地识别和修复问题,提高代码的健壮性和可维护性

一、基本内容:

1. try 块

  • 定义try 块用于包围可能会抛出异常的代码。
  • 作用 :当 try 块中的代码抛出异常时,程序的控制流将转移到相应的 catch 块(如果存在)。

示例

java 复制代码
try {
    int result = 10 / 0;  // 可能抛出 ArithmeticException
} catch (ArithmeticException e) {
    System.out.println("Cannot divide by zero!");
}

2. catch 块

  • 定义catch 块用于处理在 try 块中抛出的特定类型的异常。
  • 作用 :当 try 块中的代码抛出异常后,catch 块将执行,能够使用异常对象(如 e)获取异常的详细信息。

示例

java 复制代码
try {
    String text = null;
    System.out.println(text.length());  // 可能抛出 NullPointerException
} catch (NullPointerException e) {
    System.out.println("Caught a null pointer exception!");
}

3. 多个 catch 块

可以在一个 try 块后面跟多个 catch 块,以处理不同类型的异常。

示例

java 复制代码
try {
    int[] numbers = {1, 2, 3};
    System.out.println(numbers[5]);  // 可能抛出 ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("Array index is out of bounds!");
} catch (Exception e) {
    System.out.println("An unexpected error occurred: " + e.getMessage());
}

4. finally 块

可选的 finally 块可以与 trycatch 一起使用。无论是否发生异常,finally 块中的代码都会执行,通常用于清理资源(如关闭文件、数据库连接等)。

示例

java 复制代码
try {
    int result = 10 / 0;  // 可能抛出 ArithmeticException
} catch (ArithmeticException e) {
    System.out.println("Cannot divide by zero!");
} finally {
    System.out.println("This will always execute.");
}

5. 总结

  • try:用于包装可能会抛出异常的代码。
  • catch :用于处理 try 块中抛出的异常,允许程序继续执行。
  • 多个 catch:可以处理不同类型的异常,自上而下进行。
  • finally:可选,确保某些代码在任何情况下都会执行,适合清理资源。

二、常用的异常类型:

​ 在 Java 中,有多种内置异常类型,常用的异常类型主要分为两大类:检查异常 (Checked Exceptions)和运行时异常(Runtime Exceptions)。以下是一些常见的异常类型及其简要说明:

1. 检查异常(Checked Exceptions)

检查异常是程序在编译时需要处理的异常,通常与外部条件或不确定的操作(如文件 I/O、网络操作等)相关。

  • IOException
    • 描述:表示在输入/输出操作中发生的异常,如文件未找到、读写错误等。
    • 示例:读取不存在的文件时抛出。
  • SQLException
    • 描述:表示数据库访问错误,通常在执行 SQL 操作时发生。
    • 示例:连接数据库失败或执行 SQL 查询时出错。
  • ClassNotFoundException
    • 描述:表示尝试加载类时找不到该类的异常。
    • 示例:通过反射或动态类加载时未找到指定类。

2. 运行时异常(Runtime Exceptions)

运行时异常是程序在运行时可能会发生的异常,通常与代码逻辑错误有关。运行时异常不需要强制捕获。

  • NullPointerException
    • 描述:当程序试图访问或修改一个为 null 的对象时抛出。
    • 示例:尝试调用 null 对象的方法或访问其属性。
  • ArrayIndexOutOfBoundsException
    • 描述:当访问数组时使用了无效的索引(超出数组的边界)抛出。
    • 示例:尝试访问数组的负索引或超过数组长度的索引。
  • ArithmeticException
    • 描述:在数学运算中发生算术错误时抛出,例如除以零。
    • 示例:int result = 10 / 0; 会抛出此异常。
  • ClassCastException
    • 描述:当尝试将对象强制转换为不兼容的类型时抛出。
    • 示例:将一个 Object 类型的对象强制转换为不相关的类。

3. 错误(Errors)

虽然不属于异常的范畴,但 Java 还定义了一些错误类型,通常表示严重的问题,无法通过代码处理。

  • OutOfMemoryError
    • 描述:虚拟机内存不足,无法分配更多内存。
  • StackOverflowError
    • 描述:由于过深的递归调用导致栈溢出。

4. 自定义异常

您可以创建自己的异常类,通常用于应用程序特定的错误处理需求。这些自定义异常可以扩展 ExceptionRuntimeException

示例

java 复制代码
class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}

实例:(银行取钱,超出余额则会报出异常)

java 复制代码
import java.util.Scanner;
// 自定一个异常类
class outcomeerror extends Exception {
    public outcomeerror (String message) {
        super(message);
    }
}

// 银行账户类
class BankAccount {
    private double balance;

    public BankAccount(double sum) {
        this.balance = sum;
    }

    public void withdraw (double income) throws outcomeerror {
        if(income > balance) {
            throw new outcomeerror("Insufficient funds: Attempted to withdraw " + income + ", but balance is only " + balance);
        }
        balance-=income;
        System.out.println("Withdrawal successful! New balance: " + balance);
    }

}

public class Test_try_bank {
    public static void main(String[] args) {
//      创建一个余额为100的账户
        BankAccount ba = new BankAccount(100.0);

        try {
            ba.withdraw(150.0);
        } catch (outcomeerror e){
            System.out.println("Caught:" + e.getMessage());
        }

        try {
            ba.withdraw(50.0);
        } catch (outcomeerror e) {
            System.out.println("Caught:" + e.getMessage());
        }

        Scanner in = new Scanner(System.in);
        double input;
        System.out.println("请输入你要取钱的金额:");
        input = in.nextDouble();
        try {
            ba.withdraw(input);
        } catch(outcomeerror e) {
            System.out.println("Caught:" + e.getMessage());
        }
    }
}

总结

Java 中常用的异常类型包括:

  • 检查异常 (如 IOExceptionSQLException):编译时需要处理的异常。
  • 运行时异常 (如 NullPointerExceptionArrayIndexOutOfBoundsException):运行时可能发生的异常,通常与代码逻辑错误有关。
  • 错误 (如 OutOfMemoryError):表示严重问题,通常无法通过程序处理。
  • 自定义异常:可以根据需要创建特定的异常类以处理应用程序中的特定错误情况。

三、Exception类

​ 在 Java 中,使用 Exception 类可以捕获许多不同类型的异常(因此很多情况下可以直接用Exception代替其他异常类型使用检查错误 ),但并不能捕获所有类型的错误。以下是对 Exception 及其使用的一些详细说明:

1. Exception 的作用

  • 基类Exception 是所有检查异常(Checked Exceptions)的基类。捕获 Exception 可以处理所有从 Exception 派生的异常类型。
  • 通用捕获 :使用 catch (Exception e) 可以捕获大部分异常,包括常见的检查异常(如 IOExceptionSQLException 等)和运行时异常(如 NullPointerExceptionArrayIndexOutOfBoundsException 等)。

2. 无法捕获的错误

尽管 Exception 可以捕获许多异常,但它无法捕获所有问题。例如:

  • 错误(Error) :Java 中的 Error 类及其子类(如 OutOfMemoryErrorStackOverflowError)表示严重问题,通常不应被捕获。这些错误通常是 JVM 级别的问题,无法通过程序逻辑进行恢复。

3. 示例

下面是一个示例,展示如何使用 Exception 捕获多种类型的异常:

java 复制代码
public class ExceptionExample {
    public static void main(String[] args) {
        try {
            // 可能抛出 NullPointerException
            String text = null;
            System.out.println(text.length());
            
            // 可能抛出 ArrayIndexOutOfBoundsException
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[5]);
        } catch (Exception e) {
            // 捕获所有 Exception 的子类,包括检查异常和运行时异常
            System.out.println("Caught an exception: " + e.getMessage());
        }
    }
}

4. 使用建议

  • 捕获特定异常 :虽然使用 Exception 可以方便地捕获多种异常,但通常建议捕获更具体的异常类型。这有助于更精确地处理错误,提高代码的可读性和维护性。
  • 避免捕获 Error :不应捕获 Error 类型的异常,因为这些通常表示 JVM 级别的错误,程序无法恢复。

总结

  • 使用 Exception 可以捕获大部分检查异常和运行时异常。
  • 不能捕获 Error 类及其子类表示的严重错误。
  • 为了提高代码的健壮性和可维护性,建议优先捕获具体异常类型,而不是使用通用的 Exception

四、异常类的方法:

​ 在java中异常类的方法有很多,以下是一些常用的方法:

1.getMessage()

  • 描述 :返回一个String类型的异常描述信息。如果在抛出异常时没有提供具体的消息,返回值可能为null。
  • 用途:用于快速获取错误信息和错误定位,有助于调试和错误的记录。

示例

java 复制代码
public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            // 试图访问数组的一个超出范围的索引
            System.out.println(numbers[5]);
        } catch (ArrayIndexOutOfBoundsException e) {
            // 使用 e.getMessage() 获取异常的消息
            System.out.println("Caught an exception: " + e.getMessage());
            // 输出:Caught an exception: Index 5 out of bounds for length 3
        }
    }
}

2. getCause()

  • 描述:返回导致当前异常的原始异常(如果有)。
  • 用途:用于追踪异常链,帮助理解异常的根本原因。

示例

java 复制代码
try {
    throw new NullPointerException("Original Exception");
} catch (NullPointerException e) {
    Exception wrappedException = new Exception("Wrapped Exception", e);
    System.out.println("Cause: " + wrappedException.getCause().getMessage());
}

2. printStackTrace()

  • 描述:打印异常的堆栈跟踪信息到标准错误输出。
  • 用途:用于调试,提供异常发生时的调用栈信息。

示例

java 复制代码
try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    e.printStackTrace();  // 打印堆栈跟踪
}

3. toString()

  • 描述:返回异常的简短描述,包括异常的类名和详细消息。
  • 用途:提供异常的基本信息,通常用于日志记录。

示例

java 复制代码
try {
    int[] arr = new int[2];
    System.out.println(arr[5]);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("Exception: " + e.toString());
}

4. getStackTrace()

  • 描述 :返回一个 StackTraceElement 数组,表示异常发生时的调用栈。
  • 用途:允许开发者以编程方式访问堆栈信息。

示例

java 复制代码
try {
    String text = null;
    System.out.println(text.length());
} catch (NullPointerException e) {
    StackTraceElement[] stackTrace = e.getStackTrace();
    for (StackTraceElement element : stackTrace) {
        System.out.println(element);
    }
}

5. fillInStackTrace()

  • 描述:用于填充异常的堆栈跟踪信息。
  • 用途:通常在自定义异常类中使用,以确保堆栈跟踪信息是最新的。

总结

Java 中的异常类提供了多种方法来处理异常信息,包括:

  • getMessage():获取异常详细描述。
  • getCause():获取导致当前异常的原始异常。
  • printStackTrace():打印堆栈跟踪信息,方便调试。
  • toString():返回异常的简短描述。
  • getStackTrace():获取堆栈跟踪元素的数组,以编程方式访问堆栈信息。
  • fillInStackTrace():更新异常的堆栈跟踪信息。
相关推荐
码蜂窝编程官方几秒前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
hccee14 分钟前
C# IO文件操作
开发语言·c#
Viktor_Ye16 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm19 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
一二小选手23 分钟前
【Maven】IDEA创建Maven项目 Maven配置
java·maven
J老熊29 分钟前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
猿java33 分钟前
什么是 Hystrix?它的工作原理是什么?
java·微服务·面试
AuroraI'ncoding35 分钟前
时间请求参数、响应
java·后端·spring
zmd-zk43 分钟前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
好奇的菜鸟1 小时前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang