You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java图形程序两大问题:Square判断条件与Triangle面积计算异常

问题解决方案

问题1:区分Square与Circle的命令行参数判断

由于Square和Circle都仅需1个数值参数,仅靠args.length无法区分,最清晰的解决方案是修改命令行输入格式,增加图形类型标识作为第一个参数:

  • 创建Circle:java TestShape circle 10
  • 创建Square:java TestShape square 10
  • 创建Rectangle:java TestShape rectangle 10 20
  • 创建Triangle:java TestShape triangle 10 10 20

修改后的TestShape.java代码:

public class TestShape {
    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println("Invalid Input");
            return;
        }
        String shapeType = args[0].toLowerCase();
        switch (shapeType) {
            case "circle":
                if (args.length == 2) {
                    Circle c = new Circle(Integer.parseInt(args[1]));
                    c.getDetails();
                } else {
                    System.out.println("Circle requires 1 radius parameter");
                }
                break;
            case "square":
                if (args.length == 2) {
                    Square s = new Square(Integer.parseInt(args[1]));
                    s.getDetails();
                } else {
                    System.out.println("Square requires 1 side parameter");
                }
                break;
            case "rectangle":
                if (args.length == 3) {
                    Rectangle r = new Rectangle(Integer.parseInt(args[1]), Integer.parseInt(args[2]));
                    r.getDetails();
                } else {
                    System.out.println("Rectangle requires 2 side parameters");
                }
                break;
            case "triangle":
                if (args.length == 4) {
                    Triangle t = new Triangle(Integer.parseInt(args[1]), Integer.parseInt(args[2]), Integer.parseInt(args[3]));
                    t.getDetails();
                } else {
                    System.out.println("Triangle requires 3 side parameters");
                }
                break;
            default:
                System.out.println("Invalid Input");
        }
    }
}

问题2:Triangle面积返回-0.0的修复

核心错误原因:

  1. 半周长初始化时机错误:类成员变量s在构造函数执行前初始化,此时side1/side2/side3还是默认值0,导致s被固定为0,后续构造函数赋值也无法更新。
  2. 整数除法丢失精度:(side1+side2+side3)/2是整数除法,会丢失小数部分(如三边和为5时,半周长应为2.5,整数除法得到2)。
  3. 非法三角形判断缺失:输入的10 10 20不满足三角形两边之和大于第三边的条件,海伦公式计算时会出现负数开根号的情况。

修复后的Triangle.java代码:

public class Triangle implements Shape {
    public int side1;
    public int side2;
    public int side3;

    public Triangle(int side1, int side2, int side3) {
        this.side1 = side1;
        this.side2 = side2;
        this.side3 = side3;
        // 可选:添加非法三角形警告
        if (!isValidTriangle()) {
            System.out.println("Warning: These sides do not form a valid triangle");
        }
    }

    // 验证三角形合法性
    private boolean isValidTriangle() {
        return (side1 + side2 > side3) && (side1 + side3 > side2) && (side2 + side3 > side1);
    }

    @Override
    public double getPerimeter() {
        return side1 + side2 + side3;
    }

    @Override
    public double getArea() {
        // 在getArea中实时计算半周长,用2.0实现浮点除法
        double s = (side1 + side2 + side3) / 2.0;
        // 非法三角形返回0.0(或根据需求返回NaN/抛出异常)
        if (!isValidTriangle()) {
            return 0.0;
        }
        return Math.sqrt(s * (s - side1) * (s - side2) * (s - side3));
    }

    @Override
    public void getDetails() {
        System.out.println("Type: Triangle");
        System.out.println("Side1: " + side1);
        System.out.println("Side2: " + side2);
        System.out.println("Side3: " + side3);
        System.out.println("Perimeter: " + getPerimeter());
        System.out.println("Area: " + getArea());
    }
}

额外修复:Square的面积计算错误

原Square.java中getArea()方法错误返回side*2,应改为返回边长的平方:

public class Square implements Shape {
    public int side;

    public Square(int side) {
        this.side = side;
    }

    @Override
    public double getPerimeter() {
        return side * 4;
    }

    @Override
    public double getArea() {
        return side * side; // 修复此处
    }

    @Override
    public void getDetails() {
        System.out.println("Type: Square");
        System.out.println("Side: " + side);
        System.out.println("Perimeter: " + getPerimeter());
        System.out.println("Area: " + getArea());
    }
}

内容的提问来源于stack exchange,提问作者koda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:57:21