Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:将对象添加到树集时引发异常_Java_Exception_Treeset - Fatal编程技术网

Java:将对象添加到树集时引发异常

Java:将对象添加到树集时引发异常,java,exception,treeset,Java,Exception,Treeset,当尝试将对象添加到我的树集时,会弹出此异常 Exception in thread "main" java.lang.NullPointerException at Circle.compareTo(Shape.java:47) at Circle.compareTo(Shape.java:23) at java.util.TreeMap.compare(Unknown Source) at java.util.TreeMap.put(Unknown Source

当尝试将对象添加到我的树集时,会弹出此异常

Exception in thread "main" java.lang.NullPointerException
    at Circle.compareTo(Shape.java:47)
    at Circle.compareTo(Shape.java:23)
    at java.util.TreeMap.compare(Unknown Source)
    at java.util.TreeMap.put(Unknown Source)
    at java.util.TreeSet.add(Unknown Source)
    at CircleTreeSet.main(CircleTreeSet.java:24)
我在main方法中所做的就是创建树集,创建一个对象,然后将其添加到集合中

以下是主要方法:

class CircleTreeSet {
    public static void main(String[] args) {
        TreeSet<Circle> cs = new TreeSet<Circle>();

        Circle circle1 = new Circle("circle1", 1);

        cs.add(circle1);
    }
}
下面是课堂:

class Circle extends Shape implements Comparable<Circle> {
    private static String name;
    private int radius;

    Circle(String n, int r) {
        super(n);
        radius = r;
    }

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

    public double perim() {
        return 2 * Math.PI * radius;
    }

    public int compareTo(Circle c) {
        return name.compareTo(c.name);
    }
}
名称是静态的,并且为null,因为它从未设置过。我认为您误解了static的含义。

name是static,并且为null,因为它从未设置过。我认为您误解了静态的含义。

您的圆的名称可能不应该是静态的,您应该在圆构造函数中为其赋值:

class Circle extends Shape implements Comparable<Circle> {
    private String name;
    private int radius;

    Circle(String n, int r) {
        this.name = n; // this is crucial
        this.radius = r;
    }

    public int compareTo(Circle other) {
        return name.compareTo(other.getName());
    }

    public String getName() {
        return name;
    }
}
圆的名称可能不是静态的,您应该在圆构造函数中为其指定一个值:

class Circle extends Shape implements Comparable<Circle> {
    private String name;
    private int radius;

    Circle(String n, int r) {
        this.name = n; // this is crucial
        this.radius = r;
    }

    public int compareTo(Circle other) {
        return name.compareTo(other.getName());
    }

    public String getName() {
        return name;
    }
}
两个想法

我不确定name变量的实际用途,因为无法从类外部访问它,也无法在类内部使用它。如果未使用,请将其移除

你的比较完全不正确。想一想这样的比较

如何确定等价性?两个圆如何被视为相等? 如何确定自然顺序?圆圈是以什么方式排列的? 树集关心其元素的大小

那么,让我们来定义一些关于圆的定律

一个圆等价于另一个圆,当且仅当其半径相等时。 一个圆的秩小于另一个圆,当且仅当其半径小于另一个圆的秩时。 一个圆的等级比任何不存在的圆都高。 让我们继续研究这些定律,并定义compareTo。不过,要完全完成此任务,我们需要radius的getter:

我利用整数而不是整数,因为整数也是可比较的。这使我们的比较容易一点

public int compareTo(final Circle other) {
    if(other == null) {
        return 1;
    } else {
        return Integer.valueOf(radius).compareTo(other.getRadius());
    }
}
另一种方法,如评论中所指出的,也允许你取我们的半径和另一个物体的半径之差,这将满足可比性的总合同——如果差值为0,则它们相等;如果它大于0,那么它就更大;如果它小于0,那么它就更小

为此,我们将getter更改为返回int:

…并将我们的比较修改为:

两个想法

我不确定name变量的实际用途,因为无法从类外部访问它,也无法在类内部使用它。如果未使用,请将其移除

你的比较完全不正确。想一想这样的比较

如何确定等价性?两个圆如何被视为相等? 如何确定自然顺序?圆圈是以什么方式排列的? 树集关心其元素的大小

那么,让我们来定义一些关于圆的定律

一个圆等价于另一个圆,当且仅当其半径相等时。 一个圆的秩小于另一个圆,当且仅当其半径小于另一个圆的秩时。 一个圆的等级比任何不存在的圆都高。 让我们继续研究这些定律,并定义compareTo。不过,要完全完成此任务,我们需要radius的getter:

我利用整数而不是整数,因为整数也是可比较的。这使我们的比较容易一点

public int compareTo(final Circle other) {
    if(other == null) {
        return 1;
    } else {
        return Integer.valueOf(radius).compareTo(other.getRadius());
    }
}
另一种方法,如评论中所指出的,也允许你取我们的半径和另一个物体的半径之差,这将满足可比性的总合同——如果差值为0,则它们相等;如果它大于0,那么它就更大;如果它小于0,那么它就更小

为此,我们将getter更改为返回int:

…并将我们的比较修改为:


您将得到一个NullPointerException,因为您从未初始化静态变量名。 因此,当调用方法compareTo…,代码

return name.compareTo(c.name);
执行时,名称具有空值。您正在尝试调用一个与。。。通过此空值变量,因此这将导致引发NullPointerException


此外,将名称设置为static可能会导致每次创建对象时其值都被覆盖。静态变量在所有创建的对象中被认为是唯一的和通用的,因为它们的生命周期贯穿于整个程序运行。更进一步说,静态变量存储在计算机内存中与本地变量或对象存储在不同的位置。

您会得到一个NullPointerException,因为您从未初始化静态变量名称。 因此,当调用方法compareTo…,代码

return name.compareTo(c.name);
执行时,名称具有空值。您正在尝试调用一个与。。。通过此空值变量,因此这将导致引发NullPointerException

此外,将名称设置为static可能会导致每次创建对象时其值都被覆盖。静态变量被认为是唯一的和公共的i

n所有已创建对象之间的一种意义,因为它们的生命周期贯穿程序的整个运行。更进一步说,,静态变量存储在计算机内存中与本地变量或对象存储在不同的位置。

除了显示异常的堆栈跟踪之外,最好还显示代码。请检查:-插入到集合中的所有元素都实现了可比较的接口?我想看看您的循环是如何实现的实施了比较;也就是说,当与null进行比较时,它的行为是否正确?看起来您已经在树映射中插入了null值,并且Circle中的compareTo实现没有检查null值…删除私有静态字符串名称;从Circle开始,因为它隐藏了在Shape中定义的元素。除了异常的堆栈跟踪之外,最好还显示代码。请检查:-插入到集合中的所有元素都实现了可比较的接口?我想看看你的Circle是如何实现compareTo的;也就是说,当与null进行比较时,它的行为是否正确?看起来您已经在树映射中插入了null值,并且Circle中的compareTo实现没有检查null值…删除私有静态字符串名称;因为它隐藏了在形状中定义的一个。谢谢你指出我根本不想让它是静态的是的,名称是空的,这就是导致比较器爆炸的原因。但是,这真的解决了问题吗?删除static没有任何好处,但它仍然是一个不正确的用法…感谢Hanks指出,我根本不想让它是静态的是的,name是null,这就是导致compareTo爆炸的原因。但是,这真的解决了这个问题吗?删除static没有任何好处,但它仍然是一个不正确的用法…感谢这只是我编程中的一个练习,我有点生疏了,还有一些即将到来的问题。你为什么在getRadius中使用Integer而不是int?@PoByBolek:我利用Integer而不是int,因为整数也是可比的。这使我们的比较变得容易了一点。@Makoto如果getRadius返回int,返回半径-other.getRadius有什么问题?@PoByBolek绝对没有。如果你想避免自动装箱,那么这可以被视为一个可行的解决方案。这只是我编程中的一个练习,我有点生疏,还有一些即将到来的例子。你使用整数而不是整数作为getRadius的具体原因是什么?@PoByBolek:我利用整数而不是整数,因为整数也是可比的。这使我们的比较变得容易了一点。@Makoto如果getRadius返回int,返回半径-other.getRadius有什么问题?@PoByBolek绝对没有。如果想要避免自动装箱,那么这可以被视为一个可行的解决方案。