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的修复
核心错误原因:
- 半周长初始化时机错误:类成员变量
s在构造函数执行前初始化,此时side1/side2/side3还是默认值0,导致s被固定为0,后续构造函数赋值也无法更新。 - 整数除法丢失精度:
(side1+side2+side3)/2是整数除法,会丢失小数部分(如三边和为5时,半周长应为2.5,整数除法得到2)。 - 非法三角形判断缺失:输入的
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
相关产品推荐
相关产品推荐

