day 13 异常

一、概念

Java中的异常指的是在程序执行期间发生了一个错误或意外情况,导致程序无法正常运行或返回预期结果的情况。异常可以被抛出、捕获、处理或传递,它们可以是由Java运行时系统自动抛出的,也可以由程序员手动抛出的。常见的异常类型包括:运行时异常、空指针异常、数组越界异常、类型转换异常、IO异常等。通过处理异常,程序可以在出现错误的情况下仍然保证正常运行,或者直接向用户提供错误信息以便于问题的解决。

异常类

在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。

所有的异常类都继承自Throwable类。Java中的所有异常都被分成两类:Checked Exception(检查异常)和Unchecked Exception(非检查异常)。

  1. Checked Exception必须在方法签名中声明抛出或者捕获处理,否则编译将无法通过。Checked Exception通常发生在程序运行过程中的预期错误,例如:文件找不到、网络连接失败等。
  2. Unchecked Exception通常被称为运行时异常,不需要在方法签名中声明抛出或捕获处理。通常是由程序逻辑错误、资源不足等导致的异常,例如:空指针异常、数组越界异常等。

Throwable类又分为两类:Error和Exception。Error表示程序在运行期间遇到的严重问题,通常是无法恢复或处理的,例如:OutOfMemoryError;Exception是程序在运行期间遇到的一些可恢复或可处理的错误,例如:IOException等。Exception分为Checked Exception和Unchecked Exception两类。在Exception类下还有许多子类,例如:NullPointerException、ArithmeticException、IOException等。

二、异常的处理

有5个关键字:try catch finally throw throws

throw

在Java中,通过throw语句可以手动抛出一个异常对象。当程序执行到throw语句时,会停止当前执行的代码块,并将异常对象抛出,接下来由调用该代码块的代码进行异常处理。

throw语句的语法格式为:throw 异常对象;

例如,以下代码使用throw语句抛出一个自定义的异常对象:

public void divide(int divisor, int dividend) {
   if (dividend == 0) {
      throw new ArithmeticException("除数不能为0!");
   }
   int result = divisor / dividend;
   System.out.println("结果为:" + result);
}

在上述代码中,如果dividend为0,就会抛出一个ArithmeticException对象,异常信息为"除数不能为0!"。这样可以使我们在代码中进行异常处理,避免程序崩溃或出现其他不可预测的错误。

throws

在Java中,使用throws关键字声明方法可能会抛出的异常。

当我们使用throws关键字声明了一个方法可能会抛出某些异常时,就可以让调用该方法的代码进行异常处理。如果调用者忘记了进行异常处理,那么编译器会报错。

throws关键字的语法格式为:方法签名 throws 异常列表

其中,方法签名包括访问修饰符、返回值类型、方法名和参数列表,例如:

public void readFile(String filePath) throws IOException, FileNotFoundException {
   // 读取文件的操作
}

在上述代码中,readFile方法可能会抛出IOException和FileNotFoundException这两种异常。调用该方法的代码可以选择捕获这些异常,也可以继续抛出这些异常,交给上层的代码进行处理。

需要注意的是,如果一个方法声明了可能会抛出异常,但实际上并没有抛出异常,那么就可以不使用throws关键字声明异常,例如:

public int add(int a, int b) {
   return a + b;
}

在上述代码中,add方法不会抛出任何异常,因此就不需要使用throws关键字声明异常。

try...catch和finally

在Java中,使用try...catch语句可以捕获并处理异常。

try...catch语句的基本语法如下:

try {
    // 可能会抛出异常的代码
}
catch (ExceptionType1 e1) {
    // 处理ExceptionType1类型的异常
}
catch (ExceptionType2 e2) {
    // 处理ExceptionType2类型的异常
}
finally {
    // 可选的finally代码块,无论是否抛出异常都会执行
}

在上述代码中,try块包含可能会抛出异常的代码,catch块用于捕获并处理指定类型的异常。可以在try块中使用多个catch块来处理不同类型的异常,如IOException、NullPointerException等等。一旦try块中的代码抛出指定类型的异常,就会进入catch块中执行对应的异常处理代码。如果try块中没有抛出任何异常,则不会执行catch块的代码。

finally块是一个可选的代码块,其中的代码无论是否抛出异常都会执行,常用于释放资源等操作。例如,关闭文件、释放数据库连接等。

下面是一个示例代码,演示了如何使用try...catch语句来捕获并处理NumberFormatException异常:

public static void main(String[] args) {
    try {
        int num = Integer.parseInt("abc");
        System.out.println("数字为:" + num);
    }
    catch (NumberFormatException e) {
        System.out.println("输入的不是数字!");
    }
}

在上述代码中,Integer.parseInt("abc")会抛出NumberFormatException异常,因为"abc"无法转换为整数。在catch块中,我们用System.out.println()语句打印出了一个错误提示信息。

自定义异常

在Java中,我们可以自定义异常类来满足特定的需求。自定义异常类一般都继承自Exception或其子类,例如RuntimeException。

自定义异常类的基本语法如下:

public class MyException extends Exception {
    // 异常类的构造函数
    public MyException() {
        super();
    }

    public MyException(String message) {
        super(message);
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
    }

    public MyException(Throwable cause) {
        super(cause);
    }
}

在上述代码中,我们定义了一个名为MyException的异常类,它继承自Exception类。MyException有四个构造函数,这些构造函数都可以接收一个String类型的参数message,其中第三个和第四个构造函数还可以接受一个Throwable类型的参数cause,该参数指定导致异常的根源。

接下来,我们使用MyException类来演示自定义异常的用法。假设我们要编写一个程序,检查输入的字符串是否是合法的电子邮件地址,如果不是,就抛出一个MyException异常。

public class EmailChecker {
    public static void checkEmail(String email) throws MyException {
        if(!email.contains("@")){
            throw new MyException("Invalid email address.");
        }
    }
}

在上述代码中,checkEmail()方法会检查传入的email参数是否包含@符号,如果不包含,则抛出一个MyException异常,异常消息为"Invalid email address."。

接下来,我们可以编写一个简单的程序来使用EmailChecker类:

public class EmailTest {
    public static void main(String[] args) {
        try {
            EmailChecker.checkEmail("abc");
            System.out.println("Email is valid.");
        } catch (MyException e) {
            System.out.println(e.getMessage());
        }
    }
}

在上述代码中,我们调用了EmailChecker.checkEmail()方法并传入一个无效的电子邮件地址"abc",该方法会抛出一个MyException异常。在catch块中,我们取回该异常的消息并输出,输出结果为"Invalid email address."。

以上就是自定义Java异常的基本使用方法。通过自定义异常,我们可以更好地管理程序中的错误,并提供更好的错误提示和异常处理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值