异常处理 Java

⚡ 智能摘要

Java 异常处理提供了一种结构化的机制来管理运行时错误,这些错误会中断正常的程序流程。它使用 try、catch、finally、throw 和 throws 关键字来检测、隔离和从异常情况中恢复,同时保持程序的正常运行。ping 应用程序稳定可靠且可预测。

  • ⚠️ 已定义异常: 异常是中断标准执行序列的运行时事件,它以描述错误情况的对象形式表示。
  • 🧯 尝试捕获块: 将存在风险的代码放在 try 代码块中,并在其后添加一个或多个 catch 代码块,以便优雅地捕获特定类型的异常。
  • 🔁 最后,行为: finally 代码块总是在 try 和 catch 之后执行,因此非常适合关闭文件、套接字或释放其他系统资源。
  • ✅ 异常层级: 所有异常都继承自 Throwable,Throwable 又分为 Error 和 Exception,其中 RuntimeException 涵盖了除以零等未经检查的情况。
  • 🧪 最佳实践: 首先捕获最具体的异常,避免空的 catch 块,记录有意义的消息,并使用多重 catch 来保持代码简洁和易于维护。

异常处理 Java

什么是例外情况? Java?

An 异常在 Java 错误事件是指中断程序指令执行并扰乱程序正常执行流程的事件。它是一个封装了方法内部发生的错误事件信息的对象,并被传递给运行时系统。 Java异常主要用于指示不同类型的错误情况,以便开发人员能够以可控的方式做出响应。

错误大致可分为两类。 Java:

  1. 编译时错误
  2. 运行时错误

编译时错误还可以分为以下两种类型:

  • 语法错误
  • 语义错误

语法错误示例:

而不是声明 int a; 你错误地将其声明为 in a;编译器会因此报错。

语义错误示例: 你声明了一个变量 int a; 几行代码之后你再次声明一个整数为 int a;。编译代码时,所有这些错误都会突出显示。

运行时错误示例

运行时错误被称为 特殊课程异常是指任何中断程序正常执行流程的事件。例如,算术异常、空指针异常、除以零异常等等。 Java 这些条件往往超出开发商的直接控制范围。

点击 开始 如果视频无法访问

为什么我们需要异常处理?

假设你编写了一个用于访问服务器的程序。开发过程中一切正常。ping 在受控的本地环境中运行代码。

Java 异常处理

在实际生产运行期间,服务器可能会宕机。当你的程序尝试访问服务器时,会引发异常,如果不妥善处理,程序将突然终止。

Java 异常处理

如何处理异常 Java

到目前为止,我们已经看到,异常情况往往超出开发人员的控制范围。然而,将代码故障归咎于环境问题并非真正的解决方案。你需要健壮的编程来处理异常情况。这样的代码被称为…… 异常处理程序.

在我们的例子中,良好的异常处理意味着当主服务器宕机时,程序会自动连接到备用服务器。

Java 异常处理

为了实现这一点,你可以编写代码,使用传统的 if 和 else 条件语句连接到服务器。你需要检查服务器是否宕机,如果宕机,则编写代码连接到备用服务器。但是,当你的代码包含多个分支时,这种使用“if”和“else”分支的代码组织方式效率不高。 Java 例外 处理。

class connect{
	if(Server Up){
	 // code to connect to server
	}
	else{
	 // code to connect to BACKUP server
	}
}

尝试捕获块 Java

Java 提供内置的异常处理机制,将正常逻辑与错误恢复逻辑分离。

  1. 正常代码进入 TRY 块。
  2. 异常处理代码进入 CATCH 块。

Try Catch 块

在我们的示例中,TRY 代码块包含连接服务器的代码。CATCH 代码块包含连接备用服务器的代码。如果服务器正常运行,则 CATCH 代码块中的代码将被忽略。如果服务器宕机,则会抛出异常,并执行 CATCH 代码块中的代码。

Try Catch 块

所以,这就是异常处理的方式。 Java.

try 和 catch 的语法

try{
    statement(s)
}
catch (exceptiontype name){
	statement(s)
}

try-catch 代码块示例

步骤1) 将以下代码复制到编辑器中。

class JavaException {
   public static void main(String args[]){
      int d = 0;
      int n = 20;
      int fraction = n/d;
     System.out.println("End Of Main");
   }
}

步骤2) 保存文件并编译代码。使用命令 `java` 运行程序。 Java例外。

步骤3) 第 5 行出现算术异常(除以零),第 6 行永远不会执行。

步骤4) 现在让我们来看看 try 和 catch 如何帮助我们处理这个异常。我们将把导致异常的代码行放入一个 try 语句块中。 尝试 块,然后是 捕捉 块。将以下代码复制到编辑器中。

class JavaException {
 public static void main(String args[]) {
  int d = 0;
  int n = 20;
  try {
   int fraction = n / d;
   System.out.println("This line will not be Executed");
  } catch (ArithmeticException e) {
   System.out.println("In the catch Block due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

步骤5) 保存、编译并运行代码。您将得到以下输出。

Try Catch 块

如您所见,异常已被处理,最后一行代码也已执行。另外请注意,第 7 行不会执行,因为…… 一旦引发异常,控制流就会跳转到 catch 块。

注意: ArithmeticException 对象“e”包含有关所发生异常的信息,这在采取恢复措施时非常有用。

Java 异常类层次结构

当一个 catch 语句执行完毕后,其他 catch 语句将被跳过,程序会在 try 和 catch 代码块之后继续执行。嵌套的 catch 代码块必须遵循异常层次结构,从最具体的子类到最一般的父类。

Java 异常层次结构

  • 所有异常类 Java 扩展 Throwable 类。Throwable 有两个子类,Error 和 Exception。
  • Error 类定义了程序在正常情况下不应该发生的异常或问题,例如内存错误、硬件错误或 JVM 错误。
  • Exception 类表示程序可以处理的异常,程序可以使用 try 和 catch 块从这些异常中恢复。
  • RuntimeException 是 Exception 类的子类。这类异常表示运行时发生的未经检查的异常,这些异常在编译时无法检测到。例如,除以零异常和空指针异常都属于 RuntimeException。
  • 在输入和输出操作期间会生成 IOException 异常。
  • InterruptedException Java 在多线程操作期间,当某个线程被中断时,就会生成此错误。

示例:try 和 catch 代码块的嵌套

步骤1) 将以下代码复制到编辑器中。

class JavaException {
 public static void main(String args[]) {
  try {
   int d = 1;
   int n = 20;
   int fraction = n / d;
   int g[] = {
    1
   };
   g[20] = 100;
  }
  /*catch(Exception e){
  	System.out.println("In the catch block due to Exception = "+e);
  }*/
  catch (ArithmeticException e) {
   System.out.println("In the catch block due to Exception = " + e);
  } catch (ArrayIndexOutOfBoundsException e) {
   System.out.println("In the catch block due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

步骤2) 保存文件并编译代码。使用以下命令运行程序: java的 Java特殊课程.

步骤3) 出现 ArrayIndexOutOfBoundsException 异常。请将 int d 的值更改为 0。保存、编译并运行代码。

步骤4) 必须生成一个 ArithmeticException 异常。

步骤5) 取消第 10 行到第 12 行的注释。保存、编译并运行代码。

步骤 6)编译错误? 这是因为 Exception 是 ArithmeticException 的基类。ArithmeticException 抛出的任何异常都可以由 Exception 类处理。因此,ArithmeticException 的 catch 代码块永远不会被执行,从而导致其冗余。这就是编译错误的原因。

Java 最终块

finally 块是 无论是否引发异常都执行 在 try 块中。它是 可选 可与 try 代码块一起使用。finally 代码块是释放资源(例如数据库连接、文件或网络套接字)的合适位置。

 try {
  statement(s)
 } catch (ExceptiontType name) {

  statement(s)

 } finally {

  statement(s)

 }

如果在 try 代码块中引发异常,则在 catch 代码块执行完毕后,将执行 finally 代码块。

最后块的示例

步骤1) 将以下代码复制到编辑器中。

class JavaException {
   public static void main(String args[]){
    try{
       int d = 0;
       int n =20;
       int fraction = n/d;
    }
  catch(ArithmeticException e){
    System.out.println("In the catch block due to Exception = "+e);
  }
  finally{
	System.out.println("Inside the finally block");
  }
}
}

步骤2) 保存、编译并运行代码。

步骤3) 预期输出:即使引发异常,finally 代码块也会被执行。

步骤4) 将变量 d 的值更改为 1。保存、编译并运行代码,观察输出结果。

最佳实践 Java 异常处理

遵循一些行之有效的规则将有助于你保持…… Java 代码具有弹性、可读性和易于调试的特点:

  • 首先捕获最具体的异常,然后再捕获更一般的异常,以保持异常层次结构的完整性。
  • 避免使用空的 catch 代码块。至少要记录异常,以免丢失根本原因。
  • 使用 finally 代码块或 try with resources 语句来释放文件、套接字和数据库连接。
  • 仅当调用者能够合理恢复时才抛出已检查异常,而对于编程错误则使用未检查异常。
  • 将底层异常封装在有意义的业务异常中,以保持 API 连接正常。tracts 干净。
  • 在多线程代码中,永远不要默默地吞掉 InterruptedException,而应该恢复中断标志。

常见问题

已检查异常在编译时进行验证,必须声明或捕获,例如 IOException。未检查异常继承自 RuntimeException,在运行时发生,不需要强制处理,例如 NullPointerException 或 ArithmeticException。

无论是否发生异常,finally 代码块始终在 try 和 catch 代码块之后执行。它是释放文件句柄、数据库连接或套接字等资源的最安全位置,确保操作干净利落地终止。

throw 关键字用于方法内部,实际引发异常对象;而 throws 用于方法签名中,声明该方法可以将某些已检查异常传递给其调用者进行处理。

是的。try 代码块后面可以紧跟 finally 代码块,而无需 catch 代码块。这种模式用于开发者希望确保即使异常本身已传递给调用者,清理代码也能执行的情况。

是的。人工智能驱动的可观测性工具分析堆栈 trac通过分析错误信息、日志和代码路径来预测运行时异常可能发生的位置。它们会建议防御性检查、推荐捕获异常的位置,并暴露异常情况,从而提供帮助。ping 团队会在崩溃影响生产环境之前将其阻止。

AI 助手解析堆栈 trac它们会将错误与源代码关联起来,并提出可能的根本原因和修复方案。它们会生成 try-catch 模板,建议改进日志记录,甚至重写错误的方法,从而显著减少开发人员诊断问题所花费的时间。 Java 例外。

总结一下这篇文章: