jmu-Java-PTA题解 (06异常-03-throw与throws) 网安2312陈卓

问题要求

C语言中一般通过返回错误代码来表示一个函数执行是否有误。然而有的时候错误返回值可能与正常值相混淆。
Java中使用异常来表示程序运行中发生的错误。本实验的主要目的为了演示使用异常机制替代错误返回值。

题目内容

编写类ArrayUtils
方法:public static double findMax(double[] arr,int begin, int end)
方法功能:用来返回arr数组中在下标begin与end-1之间(包括end-1)的最大值。
注意:必须使用throws关键字声明findMax。

方法说明:

  1. 要求begin<end,否则抛出相应的异常(IllegalArgumentException)。
  2. begin不得小于0,end不得大于arr.length,否则也抛出异常。

注意:抛出异常时,应让用户知道错误发生的原因。

main方法:

  1. 输入n,创建大小为n的int数组。
  2. 输入n个整数,放入数组。
  3. 输入若干对整数,代表begin与end,然后调用ArrayUtils.findMax方法。当输入的不是整数类型字符串,则退出输入循环。
  4. 最后使用如下代码打印标识信息
try {
     System.out.println(ArrayUtils.class.getDeclaredMethod("findMax", double[].class,int.class,int.class));
} catch (Exception e1) {
} 

输入样例:

5
1 3 5 6 8 
0 5
3 3
3 4
3 2
-1 3
0 6
end

输出样例:

8.0
java.lang.IllegalArgumentException: begin:3 >= end:3
6.0
java.lang.IllegalArgumentException: begin:3 >= end:2
java.lang.IllegalArgumentException: begin:-1 < 0
java.lang.IllegalArgumentException: end:6 > arr.length
//这里是标识信息

关键点

  • 异常处理的重要性:在本实验中,通过使用IllegalArgumentException来处理非法输入,程序能够清晰地向用户反馈错误原因,避免了错误返回值与正常值混淆的问题。这种异常处理机制不仅增强了程序的健壮性,还提升了用户体验。
  • 方法的健壮性:findMax方法通过严格的参数检查,确保了在非法输入的情况下能够及时抛出异常,而不是继续执行可能导致错误的操作。这使得方法更加健壮,能够适应各种输入情况。
  • 主程序的交互性:主程序通过循环读取用户输入,并在用户输入非法数据时退出循环。这种设计使得程序能够灵活地处理用户输入,并在必要时终止操作,增强了程序的交互性。

解题步骤

第一步:编写ArrayUtils类

定义ArrayUtils类,其中包含一个静态方法findMax,用于在数组的指定范围内查找最大值。该方法需要通过throws关键字声明可能抛出的异常。

class ArrayUtils {
    public static double findMax(double[] arr, int begin, int end) throws IllegalArgumentException {
        double max = Double.MIN_VALUE;

        if (begin >= end) {
            throw new IllegalArgumentException("begin:" + begin + " >= end:" + end);
        }

        if (begin < 0) {
            throw new IllegalArgumentException("begin:" + begin + " < 0");
        }

        if (end > arr.length) {
            throw new IllegalArgumentException("end:" + end + " > arr.length");
        }

        for (int i = begin; i < end; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }
}

第二步:编写主程序

在主程序中,通过Scanner读取用户的输入,并调用findMax方法。程序需要捕获可能抛出的异常,并在用户输入非法数据时退出循环。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        double[] arr = new double[n];
        for (int i = 0; i < n; i++) {
            arr[i] = in.nextDouble();
        }
        in.nextLine();
        while (in.hasNextLine()) {
            String e = in.nextLine();
            if (e.equals("end")) {
                break;
            }
            String[] num = e.split(" ");
            int begin = Integer.parseInt(num[0]);
            int end = Integer.parseInt(num[1]);
            try {
                double max = ArrayUtils.findMax(arr, begin, end);
                System.out.println(max);
            } catch (IllegalArgumentException x) {
                System.out.println(x);
            }
        }

        try {
            System.out.println(ArrayUtils.class.getDeclaredMethod("findMax", double[].class, int.class, int.class));
        } catch (Exception e1) {
        }
    }
}

整体流程图:

整体代码:

import java.util.Scanner;

class ArrayUtils{
    public static double findMax (double[] arr,int begin, int end) throws IllegalArgumentException{
        double max = Double.MIN_VALUE;

        if(begin >= end){
            throw new IllegalArgumentException("begin:" + begin + " >= end:" + end);
        }

        if(begin<0){
            throw new IllegalArgumentException("begin:" + begin + " < 0");
        }

        if(end>arr.length){
            throw new IllegalArgumentException("end:" + end + " > arr.length");
        }

        for(int i=begin; i<end; i++){
            if(arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }
}

public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        double[] arr = new double[n];
        for(int i=0;i<n;i++){
            arr[i] = in.nextDouble();
        }
        in.nextLine();
        while(in.hasNextLine()){
            String e = in.nextLine();
            if(e.equals("end")){
                break;
            }
            String[] num = e.split(" ");
            int begin = Integer.parseInt(num[0]);
            int end = Integer.parseInt(num[1]);
            try{
                double max = ArrayUtils.findMax(arr,begin,end);
                System.out.println(max);
            }catch (IllegalArgumentException x){
                System.out.println(x);
            }
        }

        try {
            System.out.println(ArrayUtils.class.getDeclaredMethod("findMax", double[].class,int.class,int.class));
        } catch (Exception e1) {
        }
    }

}

思考:在传统的C语言中,错误处理通常是通过返回错误代码来实现的,但这种方法存在明显的局限性。例如,错误代码可能会与正常返回值混淆,导致程序逻辑难以理解和维护。而Java的异常机制则提供了一种更加清晰和直观的方式来处理错误。通过抛出异常,程序可以在错误发生时立即中断执行,并将错误信息传递给调用者。这种方式不仅避免了错误代码与正常值混淆的问题,还使得程序的错误处理逻辑更加集中和易于管理。在本实验中,findMax方法通过抛出IllegalArgumentException来处理非法输入。这种异常处理方式使得方法的使用者能够清楚地了解错误发生的原因,而无需通过返回值来猜测错误类型。此外,异常机制还提供了一种灵活的方式来处理不同类型的错误。通过定义不同的异常类,程序可以对各种错误情况进行精确的分类和处理,这种灵活性使得程序能够更好地适应复杂的业务逻辑需求。从代码结构的角度来看,异常机制的使用使得代码更加清晰和简洁。在传统的错误处理方式中,程序员需要在代码中嵌入大量的错误检查逻辑,这不仅增加了代码的复杂性,还可能导致代码的可读性下降。而通过使用异常机制,错误处理逻辑可以被集中到try-catch块中,使得主逻辑更加清晰和易于理解。这种结构化的错误处理方式不仅提高了代码的可维护性,还降低了程序出错的可能性。在实际开发中,合理使用异常机制是提高程序健壮性和用户体验的重要手段。通过抛出和捕获异常,程序可以在面对错误输入或运行时异常时保持稳定运行,并向用户提供清晰的错误提示。这种处理方式不仅增强了程序的容错能力,还提升了用户的满意度。然而,异常机制的使用也需要谨慎。过度使用异常可能会导致程序性能下降,并且可能会掩盖一些潜在的逻辑错误。因此,在设计程序时,我们需要根据具体的场景,合理地选择使用异常机制或其他错误处理方式。

posted @ 2025-04-28 13:18  取名字比写博客还难  阅读(24)  评论(0)    收藏  举报