栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java异常处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java异常处理

异常处理 选自《Java面试突击》:

编程错误可以分成三类:语法错误,逻辑错误,运行错误
1、语法错误:也称(编译错误)是在编译过程出现的错误,由编译器检查发现语法错误
2、逻辑错误:☞程序的执行结果与预期不符,可以通过调试定位并发现错误的原因
3、运行错误:是引起程序非正常中断的错误,需要通过异常处理的方式处理运行错误

1、异常处理概念

运行错误会引起异常,如果不对异常进行捕获和处理,程序就会非正常终止,并可能引起别的问题。

为了避免程序非正常终止,保证程序的稳定性,需要使用异常处理的功能。

**Java提供了try-catch块的结构,用于捕获并处理异常。**该结构包括try块和catch块两部分,分别以关键字 try 和 catch 开始,
catch块包含特定异常类型的参数。在try块中包含可能抛出异常的语句,当try块中的一个语句抛出异常且和catch块的参数的异常类型一致时,try块中剩下的语句会被跳过,catch块中的语句会被执行。

2、异常类型

Java的异常类型是Expection类,他是Throwable类的子类。
Expection类描述由程序和外部环境引起的错误,可以通过程序捕获处理这些异常。Expection类有多个子类,分别描述特定的异常。
RuntimeExpection类是Expection类的子类,描述运行时的异常,其有多和子类,分别描述特定的运行时的异常

3、异常处理的操作

Java 的异常处理基于三种操作:声明异常、抛出异常和捕获异常。

声明异常
如果一个方法可能抛出异常,则需要在方法声明中使用关键字 throws 声明异常。如果一个方法可能抛出多种类型的异常,则需要在关键字 throws 之后依次列举可能抛出的异常类型。

抛出异常
如果程序检查到错误,则可以创建一个异常的实例并抛出该异常实例。使用关键字 throw 抛出异常。

需要注意声明异常的关键字 throws 和抛出异常的关键字 throw 的区别。

捕获异常
捕获异常通过 try-catch 块实现。每个 catch 块包含一个特定异常类型的参数,如果需要捕获多种异常,则需要使用多个 catch 块,每个 catch 块分别包含一个特定异常类型的参数。

如果 try 块的执行过程中没有出现异常,则跳过 catch 块。

如果 try 块中的一个语句抛出一个异常,则跳过 try 块中剩下的语句,寻找可以处理该异常的代码,处理异常的代码称为异常处理器。具体而言,依次检查每个 catch 块,寻找可以处理该异常的 catch 块。

如果发现一个 catch 块的参数的异常类型和抛出的异常实例匹配,则将异常实例赋给该 catch 块的参数,执行该 catch 块的语句。

如果在当前方法中没有发现异常处理器,则异常没有被捕获和处理,退出当前的方法,并将异常传递给当前方法的调用者,继续寻找异常处理器。

如果一个 catch 块可以捕获一个父类的异常对象,则该 catch 块也能捕获该父类的所有子类的异常对象。

由于父类包含子类,因此需要注意 catch 块的顺序,子类异常对应的 catch 块必须出现在父类异常的 catch 块之前,否则会出现编译错误。

finally 子句
有时,无论异常是否出现或者被捕获,都需要执行一些语句,可以通过 finally 子句实现。使用关键字 finally 声明 finally 子句。

如果在 try-catch 块中包含 return 语句,finally 子句将在方法返回之前被执行。

示例代码`

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.next();
        String opStr = scanner.next();
        String str2 = scanner.next();
        scanner.close();
        System.out.println(calculate(str1, opStr, str2));
    }

    public static int calculate(String str1, String opStr, String str2) {
        int result = 0;
        try {
            int num1 = Integer.parseInt(str1);
            int num2 = Integer.parseInt(str2);
            char op = opStr.charAt(0);
            switch (op) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                result = num1 / num2;
                break;
            default:
                throw new RuntimeException("Invalid expression");
            }
            return result;
        } catch (NumberFormatException ex) {
            System.out.println("NumberFormatException");
        } catch (ArithmeticException ex) {
            System.out.println("ArithmeticException");
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
            System.out.println("The finally block");
        }
        return result;
    }
}

> 上述代码的作用是,在命令行依次输入第一个数、运算符和第二个数,计算表达式的结果并输出。方法 calculate 根据三个参数计算结果,包含 try-catch 块和 finally 子句。

由于 Exception 类包含了 NumberFormatException 类和 ArithmeticException 类,因此 Exception 类的 catch 块必须放在 NumberFormatException 类和 ArithmeticException 类的 catch 块之后,否则会出现编译错误。

方法 calculate 中的 finally 子句在任何情况下都会执行。如果 try 块的执行过程中没有出现异常,则 finally 子句将在方法返回之前被执行。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/java-interview-highlights/enlxog/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


###### 1、列举五种java常见的异常类型
NullPointerException:空指针异常。
ArrayIndexOutOfBoundsException:数组下标越界异常。
ArithmeticException:算术运算异常。
NumberFormatException:数字格式异常。
IOException:输入输出异常。

##### 2. 如果需要在 catch 块捕获和处理多种类型的异常,且这些异常的类之间存在父类和子类的关系,应该如何确定 catch 块的顺序?


子类异常对应的 catch 块必须出现在父类异常的 catch 块之前,否则会出现编译错误。


#### 3. 在 finally 子句中一般放置什么代码?


在 finally 子句中的代码总是会被执行,无论异常是否出现或者被捕获。因此在 finally 子句中放置必须被执行的代码。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836091.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号