PTA 7-87 jmu-Java-m07 面积计算 题解

7-87 jmu-Java-m07 面积计算

解析

Tips:题面移至最后
简单题,模拟题意即可。
不过其实最开始我是拿 ai 写的,然后对着样例逐个修改调试。

这道题让我对 java 异常处理有了深入了很多的理解,比如“如果异常没有被捕获,则会沿着调用链向上抛出,直到找到合适的异常处理器或者程序结束。如果没有任何地方捕获这个异常,它最终会被 JVM 的默认异常处理器处理,通常会导致程序打印堆栈跟踪信息并终止。”这一句,第一次读会感到非常的抽象。

总之,此题异常处理过程就是局部程序定义异常对象并传入参数,然后抛出直至被原调用链捕获进行输出报告。

另外需要注意的一点是异常对象的toStirng().getMessage()方法有区别。

代码

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line;

        while (scanner.hasNextLine()) {
            try {
                line = scanner.nextLine();
                if (line.equals("!!!!!")) break;
                if (line.isEmpty()) throw new NullPointerException();
                double[] radii = getRadius(line);
                System.out.println(getFiveArea(radii));
            }catch (NullPointerException e) {
                // 特别处理 NullPointerException 异常
                System.out.println(e.toString());
                System.out.println("java.lang.ArrayIndexOutOfBoundsException: 4");
                System.out.println("0.0");
            }
            catch (Exception e) {
                System.out.println(e.getMessage());
                //System.out.println("java.lang.ArrayIndexOutOfBoundsException: 4");
                System.out.println("0.0");
            }
        }
        scanner.close();
    }
    private static double[] getRadius(String line) {

        String[] parts = line.split("\\s+");
        //\\s:这是正则表达式中的一个元字符,代表任何空白字符。反斜杠 \ 是转义字符,所以为了表示正则表达式的 \s,我们需要使用双反斜杠 \\。
        //+:这是正则表达式中的一个量词,意味着“一个或多个”。它指定了前面的元素(在这个例子中是空白字符)可以连续出现一次或多次。
        double[] radii = new double[parts.length];

        for (int i = 0; i < parts.length; i++) {
            try {
                radii[i] = Double.parseDouble(parts[i].trim());
            } catch (NumberFormatException e) {
                System.out.println("java.lang.NumberFormatException: "+e.getMessage());
            }
        }

        return radii;
    }
    private static double getFiveArea(double[] circles) {
        if (circles.length < 5) {
            throw new IndexOutOfBoundsException("java.lang.ArrayIndexOutOfBoundsException: 4");
        }

        double fifthRadius = circles[4];
        if (fifthRadius <= 0) {
            throw new RuntimeException("java.lang.RuntimeException");
        }

        return Math.PI * Math.pow(fifthRadius, 2);
    }
}

题面

7-87 jmu-Java-m07 面积计算

在main方法中定义两个静态方法double[] getRadius(String line)以及double getFiveArea(double[] circles)。分别用于将一行数据转换为一个半径数组以及求半径数组中第五个数据对应的圆形的面积(π的值使用Math类中的PI,平方计算使用Math中的pow()方法)。

首先输入多行数据,遇到"!!!!!"时停止输入,调用getRadius方法将每一行数据转化为半径数组,其中按空格进行数据的分割,其中如果输入的是空行则抛出NullPointerException异常,否则则进行相应的数据转换。若发生异常则输出异常信息(toString()方法),接着使用getFiveArea()方法得到并输出转换完成后的数组中的第五个数据对应的圆形面积,如果数组长度小于5,则抛出IndexOutOfBoundsException异常,如果数组的第五个数据小于等于0,则抛出RuntimeException异常。

输入格式:

以"!!!!!"为结尾的多行数据

输出格式:

每行数据转换成半径数组后的第五个数据对应的圆形面积的大小

输入样例1:

1 2 3 4 5 6

1 2 e r 3 4
1 1
3 3 3 3 -4
2 2 2 2 2 4 5
!!!!!

输出样例1:

78.53981633974483
java.lang.NullPointerException
java.lang.ArrayIndexOutOfBoundsException: 4
0.0
java.lang.NumberFormatException: For input string: "e"
java.lang.NumberFormatException: For input string: "r"
28.274333882308138
java.lang.ArrayIndexOutOfBoundsException: 4
0.0
java.lang.RuntimeException
0.0
12.566370614359172

输入样例2:

2 7 4
5 R 4 7 9 p
2 2 2 2 -6
2 3 4 5 6 7 8
3 4 4 7 e 3
!!!!!

输出样例2:

java.lang.ArrayIndexOutOfBoundsException: 4
0.0
java.lang.NumberFormatException: For input string: "R"
java.lang.NumberFormatException: For input string: "p"
254.46900494077323
java.lang.RuntimeException
0.0
113.09733552923255
java.lang.NumberFormatException: For input string: "e"
java.lang.RuntimeException
0.0
posted @ 2025-01-14 01:21  [丘李]Chilllee  阅读(28)  评论(0)    收藏  举报