随笔 - 86  文章 - 5  评论 - 11  阅读 - 10万 

什么是异常?

  异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

异常发生的原因有很多,通常包含以下几大类:

  用户输入了非法数据。

    要打开的文件不存在。

    网络通信时连接中断,或者JVM内存溢出。

异常处理:

  Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。Throwable又派生出Error类和Exception类。

  Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws。

 Java异常的分类和类结构图:

异常类型 说    明

Exception 

异常层次结构的父类

ArithmeticException

算术错误情形,如以零作除数

ArrayIndexOutOfBoundsException

数组下标越界

NullPointerException

尝试访问 null 对象成员

ClassNotFoundException

不能加载所需的类

IllegalArgumentException

方法接收到非法参数

ClassCastException

对象强制类型转换出错

NumberFormatException

数字格式转换异常,如把"abc"转换成数字

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捕获异常

  try:执行可能产生异常的代码。

  catch:捕获异常。

  finally:无论是否发生异常,代码总能执行。

复制代码
public void method(){
try {
      // 代码段 1
      // 产生异常的代码段 2
      // 代码段 3
} catch (异常类型 ex) {
      // 对异常进行处理的代码段4
}
// 代码段5
}
复制代码

异常的处理示例:

复制代码
import java.util.Scanner;
/**
 * 使用try-catch-finally进行异常处理。
*/
public class Test {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入被除数:");
        try {
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(String.format("%d / %d = %d",
                    num1, num2, num1/ num2));
        } catch (Exception e) {
            System.err.println("出现错误:被除数和除数必须是整数," +
                    "除数不能为零。");
            System.out.println(e.getMessage());
            //System.exit(1); // finally语句块不执行的唯一情况
        } finally {
            System.out.println("感谢使用本程序!");
        }
    }
}
复制代码

多重异常示例:

复制代码
import java.util.Scanner;
import java.util.InputMismatchException;
/**
 * 多重catch块。
*/
public class Test {
  public static void main(String[] args) {
      Scanner in = new Scanner(System.in);
      System.out.print("请输入被除数:");
          try {
          int num1 = in.nextInt();
          System.out.print("请输入除数:");
          int num2 = in.nextInt();
          System.out.println(String.format("%d / %d = %d", 
                  num1, num2, num1/ num2));
      } catch (InputMismatchException e) {
          System.err.println("被除数和除数必须是整数。");
      } catch (ArithmeticException e) {
          System.err.println("除数不能为零。");
      } catch (Exception e) {
          System.err.println("其他未知异常。");
      } finally {
          System.out.println("感谢使用本程序!");
      }
   }
}
复制代码

多重异常的执行规则:

  排列catch 语句的顺序:先子类后父类

  发生异常时按顺序逐个匹配

  只执行第一个与异常类型匹配的catch语句

 

 声明异常

 throws:声明方法可能要抛出的各种异常。

 如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部

 

抛出异常

 throw:手动抛出异常。示例如下:

复制代码
 1 public class Person {
 2     private String name = "";   // 姓名
 3     private int age = 0;   // 年龄
 4     private String sex = "男";  // 性别
 5     public void setSex(String sex) throws Exception {
 6         if ("男".equals(sex) || "女".equals(sex))
 7             this.sex = sex;
 8         else {
 9             throw new Exception(“性别必须是\"男\"或者\"女\"!");
10         }
11     }
12 }
复制代码

 

posted on   史振兴  阅读(157)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示