"Circle" class 和 Java 中的构造函数有问题吗?

Issue with "Circle" class and Constructor in Java?

好的,这是我正在处理的作业:

"创建一个带有图形用户界面的 Java 项目,允许用户 select 他们希望使用的形状:方形、矩形、圆形、三角形

然后他们输入形状的尺寸,然后可以 select 计算形状的面积。

您将使用基数 class "Shape",然后有 4 个不同的 class 继承自 Shape 以计算面积。您对 Area 的计算应使用适当的 class 的 area() 方法

我对 GUI 的想法是让用户通过同一组中的单选按钮选择形状,然后让他们在各自的文本字段中输入尺寸(高度和宽度)。在完成这两项操作后,他们会按下一个按钮,然后计算形状的面积。

我的问题是,我已经创建了基础形状 class 和四个继承 class 元素,并且我已经 "connected" 将它们添加到主 class 中GUI 尽我所能,但是在尝试计算圆面积时出现异常,因为程序希望用户在高度和宽度字段中输入数字,而我希望仅通过宽度计算圆面积字段(因为公式只需要一维)。我设置了多个构造函数来处理这个问题,但我显然做错了什么。所有其他形状的计算都很好。

这是按下按钮时的主要 (GUI) 代码:

private void buttonAreaActionPerformed(java.awt.event.ActionEvent evt) {                                           

        int height = Integer.parseInt(tfHeight.getText());
        int width = Integer.parseInt(tfWidth.getText());

        try {
            Square mySquare = new Square(height,width);
            Circle myCircle = new Circle(width);
            Triangle myTriangle = new Triangle(height,width);
            Rectangle myRectangle = new Rectangle(height,width);

            double result = 0;

            if (rbSquare.isSelected()) {
                result = mySquare.area();
            }//end of if block
            else if (rbCircle.isSelected()){
                result = myCircle.area();
            }
            else if (rbTriangle.isSelected()){
                result = myTriangle.area();
            }
            else if (rbRectangle.isSelected()){
                result = myRectangle.area();
            }//end of else block

            JOptionPane.showMessageDialog(this, "Area is " + result);
        }//end of try block
        catch (NumberFormatException ex) {
            //Display new window with text upon catching exception
            JOptionPane.showMessageDialog(this, "Please enter the proper dimensions");
        }//end of catch block
    }                                          

这是基本形状 class 代码:

public class Shape extends mainWindow {
    //create properties for class
    int width;
    int height;

    //default constructor to override method
    public Shape(){
        //"this" uses properties above
        width = 0;
        height = 0;
    }//end of constructor

    //create the constructor (same as the class name) and pass it arguments
    public Shape(int height, int width){
        //"this" uses properties above
        this.height = height;
        this.width = width;
    }//end of constructor

    public Shape(int width) {
        this.width = width;
    }

这里是圆class代码:

public class Circle extends Shape {
    //constructor
    Circle(int width){
        this.width = width;

    }

    public double area(){
        return Math.PI*(width*width);
    }
}

所以重申一下,当用户选择“圆形”选项然后输入宽度尺寸时,他们会收到错误消息。他们必须在高度和宽度框中输入尺寸,这不是我想要的(它实际上并没有获取高度值并用它来计算,但它要求填充高度文本字段)

谁能帮我解决这个问题或告诉我哪里出错了?

这是异常堆栈跟踪:

线程中出现异常 "AWT-EventQueue-0" java.lang.NumberFormatException:对于输入字符串:“” 在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java.lang.Integer.parseInt(Integer.java:592) 在 java.lang.Integer.parseInt(Integer.java:615) 在 bism3800.mainWindow.buttonAreaActionPerformed(mainWindow.java:150) 在 bism3800.mainWindow.access000 美元(mainWindow.java:14) 在 bism3800.mainWindow$1.actionPerformed(mainWindow.java:71) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.Component.processMouseEvent(Component.java:6533) 在 javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 在 java.awt.Component.processEvent(Component.java:6298) 在 java.awt.Container.processEvent(Container.java:2236) 在 java.awt.Component.dispatchEventImpl(Component.java:4889) 在 java.awt.Container.dispatchEventImpl(Container.java:2294) 在 java.awt.Component.dispatchEvent(Component.java:4711) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 在 java.awt.Container.dispatchEventImpl(Container.java:2280) 在 java.awt.Window.dispatchEventImpl(Window.java:2746) 在 java.awt.Component.dispatchEvent(Component.java:4711) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) java.awt.EventQueue.access500 美元(EventQueue.java:97) 在 java.awt.EventQueue$3.run(EventQueue.java:709) 在 java.awt.EventQueue$3.run(EventQueue.java:703) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) 在 java.awt.EventQueue$4.run(EventQueue.java:731) 在 java.awt.EventQueue$4.run(EventQueue.java:729) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

您的代码只执行您告诉它执行的操作。在侦听器的开头,您从 both 文本字段中提取文本,然后解析它们,这种情况会发生 无论选择了哪个单选按钮 :

private void buttonAreaActionPerformed(java.awt.event.ActionEvent evt) {

    // this code is **always** run, no matter what
    int height = Integer.parseInt(tfHeight.getText());
    int width = Integer.parseInt(tfWidth.getText());

显而易见的解决方案是不这样做。仅在需要时以及在 if 语句中解析需要的内容。

您的关键问题是您没有执行最重要的调试步骤:在脑海中遍历您的代码,以了解它在每一步中的作用。现在开始经常这样做。

根据 How to Think Like a Computer Scientist 文章:

In order to program, you need to have a mental model of how programs work. If you write a program that doesn’t do what you expect, very often the problem is not in the program; it’s in your mental model.