【问题标题】:Exception when trying to make a super call to abstract class尝试对抽象类进行超级调用时出现异常
【发布时间】:2021-08-16 00:24:14
【问题描述】:

我对 Java 还是很陌生。这是我正在为类工作的项目,我必须在其中实现抽象类和接口才能构建多边形层次结构。但是,我可以告诉某处的代码有问题。我有一个定义 3 个函数的接口 Polygon() 和一个实现所述接口的抽象类 SimplePolygon()。我想我可能在这里做错了 for 循环,但我不确定。数组的大小必须不同,具体取决于它是三角形还是其他形状,所以我不能硬编码为 3 的大小。

public abstract class Simple_Polygon implements Polygon
{
    protected Point vertices[];
    
    public Simple_Polygon(int vertAmount)
    {
        if (vertAmount < 3)
        {
            throw new IllegalArgumentException("A polygon has 3 vertices or more!");
        }

        for (int i = 0; i < vertAmount; i++)
        {
            vertices[i] = new Point(0, 0);
        }
        
    }
}

然后我有扩展 Polygon() 的类 Triangle()。

public class Triangle extends Simple_Polygon
{
    public Triangle(Point p1, Point p2, Point p3)
    {
        super(3);
        
        vertices[0] = p1;
        vertices[1] = p2;
        vertices[2] = p3;
        
    }
}

最后我有一个由创建三角形对象的老师编写的测试器类。但是,每次我运行它都会得到

Exception in thread "main" java.lang.NullPointerException: Cannot store to object array because "this.vertices" is null
    at polygons.Simple_Polygon.<init>(Simple_Polygon.java:23)
    at polygons.Triangle.<init>(Triangle.java:14)

分别是抽象构造函数和super调用中的for循环。我曾尝试查看抽象类与接口类的不同问题,但我似乎找不到任何东西。我认为这与我在数组中分配值的方式有关。有人有什么想法吗?

【问题讨论】:

  • 在你的数组声明中,你还没有创建数组,只是定义了类型。

标签: java arrays interface abstract-class super


【解决方案1】:

您需要创建数组作为构造函数的一部分:

public abstract class Simple_Polygon implements Polygon {
protected Point vertices[];

public Simple_Polygon(int vertAmount)
{
    if (vertAmount < 3)
    {
        throw new IllegalArgumentException("A polygon has 3 vertices or more!");
    }

    vertices = new Point[vertAmount];

    for (int i = 0; i < vertAmount; i++)
    {
        vertices[i] = new Point(0, 0);
    }
    
}
}

【讨论】:

    【解决方案2】:

    NullPointerException 在您尝试引用已声明但未定义的对象时抛出。

    在上面的例子中,你指的是vertices,但从未初始化变量。

    使用以下语句定义vertices 的值

    this.vertices = new Point[vertAmount];

    您的上下文中的完整示例。

    public abstract class Simple_Polygon implements Polygon
    {
        protected Point vertices[];
        
        public Simple_Polygon(int vertAmount)
        {
            if (vertAmount < 3)
            {
                throw new IllegalArgumentException("A polygon has 3 vertices or more!");
            }
    
            this.vertices = new Point[vertAmount];
            for (int i = 0; i < vertAmount; i++)
            {
                vertices[i] = new Point(0, 0);
            }
            
        }
    }
    

    【讨论】:

    • 啊,好吧。我想我实际上可以删除 for 循环,因为我需要做的就是初始化数组。谢谢!
    • 有两件事,1. 你想初始化数组 2. 你想在那些各自的索引处初始化值。如果您打算只做第一个,那么可以,您可以删除 for 循环
    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2014-07-29
    • 2012-05-22
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多