21xrx.com
2024-11-22 03:44:34 Friday
登录
文章检索 我的文章 写文章
Java中的异常处理
2021-07-08 16:47:59 深夜i     --     --
J a v a

Java 异常处理:我们通过合适的示例学习如何在 Java 中处理异常。 异常是程序执行时发生的错误。 在编译时,语法和语义检查已完成,代码不会在机器上执行,因此在运行时会捕获异常。

 

考虑以下将两个整数相除的 Java 程序。

import java.util.Scanner;


class Division {
  public static void main(String[] args) {
 
  int a, b, result;
   
  Scanner input = new Scanner(System.in);
  System.out.println("Input two integers");
 
  a = input.nextInt();
  b = input.nextInt();
 
  result = a / b;
   
  System.out.println("Result = " + result);
  }
}

 

现在我们对程序进行两次编译和执行,看到两种情况下程序的输出:

在第二种情况下,我们将 'a' 除以零,这在数学中是不允许的,因此会发生运行时错误,即发生异常。 发生这种情况是因为用户的输入无效。 所以我们必须采取预防措施,最好的办法是通知用户这是不允许的或任何其他与上下文相关的有意义的消息。 可以看到异常发生时显示的信息。 它包括线程的名称、文件名、发生它的代码行(在本例中为 14)、异常的名称(ArithmeticException)及其描述('/ by zero')。 异常不仅仅因为无效输入而发生。 有些原因超出了程序员的控制范围,例如堆栈溢出异常、内存不足异常(当应用程序需要的内存大于可用内存时)。

Java 提供了一种处理此类异常的强大方法,称为异常处理。 在其中我们编写易受攻击的代码,即可以在称为 try 块的单独块中抛出异常的代码和在称为 catch 块的另一个块中的异常处理代码。 以下修改后的代码处理异常。

Java异常处理示例

class Division {
  public static void main(String[] args) {
 
  int a, b, result;
 
  Scanner input = new Scanner(System.in);
  System.out.println("Input two integers");
 
  a = input.nextInt();
  b = input.nextInt();
 
  // try block
 
  try {
    result  = a / b;
    System.out.println("Result = " + result);
  }
 
  // catch block
 
  catch (ArithmeticException e) {
    System.out.println("Exception caught: Division by zero.");
  }
  }
}

每当捕获到异常时,就会执行相应的 catch 块。 例如,程序仅捕获 ArithmeticException。 如果抛出其他类型的异常,它不会被捕获,因此程序员有责任处理所有异常。 就像在我们的 try 块中一样,我们正在执行算术,所以我们只捕获算术异常。 捕获任何异常的一种简单方法是使用 Exception 类的对象,因为其他类会继承它。 请参阅下面的另一个示例:

class Exceptions {
  public static void main(String[] args) {
 
  String languages[] = { "C", "C++", "Java", "Perl", "Python" };
   
  try {
    for (int c = 1; c <= 5; c++) {
      System.out.println(languages[c]);
    }
  }
  catch (Exception e) {
    System.out.println(e);
  }
  }
}

程序的输出:

C++
Java
Perl
Python
java.lang.ArrayIndexOutOfBoundsException: 5

在这里,catch 块捕获了一个异常,因为我们试图访问一个不存在的数组元素(在这种情况下是languages[5])。 一旦发生异常,控制就会从 try 块中出来,它的其余指令不会执行。

最后在 Java 中阻塞

无论是否抛出异常,finally 块总是被执行。

class Allocate {
  public static void main(String[] args) {
   
    try {
      long data[] = new long[1000000000];
    }
    catch (Exception e) {
      System.out.println(e);
    }
   
    finally {
      System.out.println("Block finally always executes.");
    }
  }
}

程序的输出:

Block finally always executes.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Allocate.main(Allocate.java:5)

发生异常是因为我们尝试分配大量不可用的内存。 您的系统上可能有此内存量; 如果是这种情况,请尝试增加您在程序中分配的内存量。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复