### Java异常处理程序实验知识点详解 #### 一、实验目的 本实验旨在让学习者深入了解Java中的异常处理机制,特别是`try-catch-finally`结构的使用方式,并掌握如何自定义异常类。此外,还将涉及如何在接口实现过程中处理异常。 #### 二、实验内容 ##### 1. 使用 `try-catch-finally` 结构实现异常处理 **实验说明**: 此部分要求通过编写一段程序来展示如何使用 `try-catch-finally` 结构来捕获并处理数组越界异常。 **代码解析**: ```java public class shiyan3_1 { public static void main(String[] args) { int i = 0; String[] greeting = {"Hello", "Only", "Test"}; while (i < 4) { try { System.out.println(greeting[i]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组越界"); } finally { System.out.println("总会运行"); } i++; } } } ``` - **主函数**: 定义了一个长度为3的字符串数组 `greeting`。 - **循环**: 循环4次,当循环到第4次时,索引 `i` 的值为3,这将导致数组越界异常。 - **try块**: 尝试执行可能引发异常的代码。 - **catch块**: 捕获由try块引发的特定类型异常,并打印出“数组越界”。 - **finally块**: 无论是否发生异常,都会执行此块中的代码。这里打印“总会运行”。 **运行结果**: ``` Hello Only Test 数组越界 总会运行 总会运行 总会运行 总会运行 ``` ##### 2. 自定义异常类与条件性异常抛出 **实验说明**: 该部分要求自定义一个异常类 `MyException` 并在满足特定条件时抛出异常。 **代码解析**: ```java public class shiyan3_2 { static class xyz { public void test(String X) { if (X.equals("XYZ")) { try { throw new MyException("This is a XYZ,异常!!!!"); } catch (MyException e) { throw new RuntimeException(e); } } else if (!X.equals("ABC")) { System.out.println("只允许输出 XYZ and ABC"); } else { System.out.println("正确"); } } } static class MyException extends Exception { public MyException(String message) { super(message); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); xyz demo1 = new xyz(); demo1.test(sc.nextLine()); } } ``` - **自定义异常类**: `MyException` 继承自 `Exception` 类。 - **条件判断**: 当输入字符串为 “XYZ” 时抛出 `MyException`,当输入为 “ABC” 时正常运行,其他情况下提示“只允许输出 XYZ and ABC”。 - **运行流程**: - 输入 “XYZ” 会抛出异常,并在控制台显示 “This is a XYZ,异常!!!!”。 - 输入 “ABC” 则显示 “正确”。 - 输入非 “XYZ” 或 “ABC” 的其他字符时,显示 “只允许输出 XYZ and ABC”。 **运行结果**: - 输出 “XYZ” 时抛出异常: ``` This is a XYZ,异常!!!! ``` - 输入 “ABC” 时正常运行: ``` 正确 ``` - 输入既不是 “XYZ” 也不是 “ABC”: ``` 只允许输出 XYZ and ABC ``` ##### 3. 接口实现过程中的异常处理 **实验说明**: 这部分要求声明一个 `Average` 接口,并实现多个类来计算不同场景下的平均值。同时,需要处理输入非数值字符串时的异常。 **接口声明**: ```java interface Average { double average(double... numbers); } ``` **示例类**: ```java class SimpleAverage implements Average { @Override public double average(double... numbers) { if (numbers.length == 0) throw new IllegalArgumentException("No numbers provided."); return Arrays.stream(numbers).average().orElseThrow(() -> new IllegalArgumentException("Cannot compute average.")); } } class RobustAverage implements Average { @Override public double average(double... numbers) { if (numbers.length < 2) throw new IllegalArgumentException("Not enough numbers to compute robust average."); double max = Arrays.stream(numbers).max().getAsDouble(); double min = Arrays.stream(numbers).min().getAsDouble(); double sum = Arrays.stream(numbers).filter(n -> n != max && n != min).sum(); return sum / (numbers.length - 2); } } ``` - **SimpleAverage** 类实现了简单的平均值计算逻辑。 - **RobustAverage** 类实现了去除最大值和最小值后的平均值计算逻辑。 **异常处理**: 在读取用户输入时,需要确保输入可以被转换为数字。可以通过以下方式实现: ```java public static void main(String[] args) { Scanner scanner = new Scanner(System.in); List<Double> numbers = new ArrayList<>(); while (scanner.hasNext()) { try { String input = scanner.next(); double num = Double.parseDouble(input); numbers.add(num); } catch (NumberFormatException e) { System.out.println("无效输入,请输入数字。"); } } // 计算平均值... } ``` - **循环读取输入**:使用 `Scanner` 读取用户输入。 - **异常捕获**:当输入无法转换为数字时,捕获 `NumberFormatException` 并提示用户重新输入。
剩余13页未读,继续阅读
- 粉丝: 637
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助