为什么我的排序实现中出现 NullPointerException?

2023-12-24

我正在做我的作业,我想为我的数组创建一个排序方法。但是,我在排序方法中遇到空指针错误,我不确定为什么。这是我下面的代码。

public Object[] sorted() {
    getSetArray();
    Arrays.sort(setArray);
    return setArray;
}

这些是我的错误 java.lang.NullPointerException 行 java.util.ComparableTimSort.binarySort(ComparableTimSort.java:232) 在 java.util.ComparableTimSort.sort(ComparableTimSort.java:176) 在 java.util.ComparableTimSort.sort(ComparableTimSort.java:146) 在 java.util.Arrays.sort(Arrays.java:472) 在 setadt.SetADT.sorted(SetADT.java:280) 在 setadt.SetADTDriver_sol.main(SetADTDriver_sol.java:233)

package setadt;
import java.util.*;



public class SetADT {

    private static Random rand = new Random();
    private final int DEFAULT_CAPACITY = 100;
    private final int NOT_FOUND = -1;
    private int size;
    private Object[] setArray;

    public SetADT() {
        size = 0;
        setArray = new Object[DEFAULT_CAPACITY];
    }

    public SetADT(int capacity) {
        size = 0;
        setArray = new Object[capacity];
    }

    public void add(Object newElement) {

        if (size() == setArray.length) {
            resize();
        }
        if(!contains(newElement) == true){
           setArray[size] = newElement;
         size++;   
        }
        //System.out.println(newElement +"\t" + size);
    }

    public void addAll(SetADT set) {

        Object[] temp = set.getSetArray();

        for (int i = 0; i < set.size(); i++) {
            if (!this.containsValue(temp[i])) {
                add(temp[i]);
            }
        }
    }
   public boolean contains(Object element) {

        for (int i = 0; i < size; i++) {
            if (setArray[i].equals(element)) {
                return true;
            }
        }

        return false;
    }

    public boolean containsValue(Object element) {

        for (int i = 0; i < size; i++) {
            if (setArray[i].toString().equals(element.toString())) {
                return true;
            }
        }

        return false;
    }

    public boolean equals(SetADT set) {

        boolean result = false;
        Object element;

        if (size() == set.size()) {
            result = true;
            for (int i = 0; i < size(); i++) {
                element = setArray[i];
                if (!set.contains(element)) {
                    return false;

                }
            }
        }

        return result;
    }

    public boolean isEmpty() {

        if (size == 0) {
            return true;
        } else {
            return false;
        }
    }

    public Object remove(Object element) {

        Object result = new Integer(NOT_FOUND);
        int search = NOT_FOUND;

        if (!isEmpty()) {
            for (int i = 0; i < size() && search == NOT_FOUND; i++) {
                if (setArray[i].equals(element)) {
                    search = i;
                }
            }

            if (search != NOT_FOUND) {

                result = setArray[search];

                setArray[search] = setArray[size - 1];
                setArray[size - 1] = null;
                size--;
            }
        }

        return result;
    }
    public Object removeRandom() {
        int element;
        Object value = new Integer(NOT_FOUND);

        if (!isEmpty()) {

            element = rand.nextInt(size);
            value = setArray[element];

            setArray[element] = setArray[size - 1];
            setArray[size - 1] = null;
            size--;
        }

        return value;
    }
    public int size() {

        return size;
    }
    public SetADT union(SetADT set) {

        SetADT newSet = new SetADT();

        newSet.addAll(this);
        newSet.addAll(set);

        return newSet;
    }

    private void resize() {

        Object[] newArray = new Object[setArray.length * 2];

        for (int i = 0; i < setArray.length; i++) {
            newArray[i] = setArray[i];
        }

        setArray = newArray;
    }

    public Object[] getSetArray() {

        return setArray;
    }

    public String toString() {
        String result = "";

        for (int i = 0; i < size(); i++) {
            if ((i % 10) == 0 && i != 0) {
                result += "\n";
            } 

            result = result + setArray[i].toString() + "\t";
        }
        return result;
    }

    public SetADT intersection(SetADT set) {

        SetADT newSet = new SetADT(); 
        for(int index = 0; index < set.size; index++){
            if(set.contains(set) == set.contains(setArray)){
                newSet.add(set);
            }   
        }
        return newSet;
    }

    public SetADT difference(SetADT set) {

        SetADT newSet = new SetADT();
        for(int index = 0; index < set.size; index++){
            if(set.contains(set) == false){

                newSet.add(set);
            }
        }
        return newSet;
    }

    public Object[] sorted() {
        setArray = getSetArray();
        Arrays.sort(setArray);
        return setArray;
    }

    public static String getObjectArray(Object[] o) {
        String s = "";
        for (int i = 0; i < o.length; i++) {
            s += (o[i] + " ");
        }
        return s;

    }
}

NPE 的原因是您在数组中存储了 null。实施比较Tim排序 http://cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/src/share/classes/java/util/ComparableTimSort.java.html不检查 null。

 private static void binarySort(Object[] a, int lo, int hi, int start) {
 214         assert lo <= start && start <= hi;
 215         if (start == lo)
 216             start++;
 217         for ( ; start < hi; start++) {
 218             @SuppressWarnings("unchecked")
 219             Comparable<Object> pivot = (Comparable) a[start];
 220 
 221             // Set left (and right) to the index where a[start] (pivot) belongs
 222             int left = lo;
 223             int right = start;
 224             assert left <= right;
 225             /*
 226              * Invariants:
 227              *   pivot >= all in [lo, left).
 228              *   pivot <  all in [right, start).
 229              */
 230             while (left < right) {
 231                 int mid = (left + right) >>> 1;
 232                 if (pivot.compareTo(a[mid]) < 0)
 233                     right = mid;
 234                 else
 235                     left = mid + 1;
 236             }
 237             assert left == right;
 238 

您必须确保数组中不存储空值。

为此,您必须断言方法中传递的参数add不为空,并在排序到有效大小之前创建容器的副本。

public Object[] sorted() {

    Object[] toSort = Arrays.copyOf(getSetArray(),getSize());
    Arrays.sort(toSort);
    return toSort;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的排序实现中出现 NullPointerException? 的相关文章

随机推荐

  • WildFly 多个域和 SSL 证书

    我有两个不同的域 example1 com example2 com 每个域都有自己的 SSL 证书 我现在想做的是将两个域用于同一个 WildFly 实例 支持 SSL WildFly 文档指出 我只能引用密钥库中的单个证书 因此 我不能
  • 在 ASP.Net MVC 3 中处理 Ajax 调用的正确方法

    当在 ASP Net MVC 中编码 Ajax 调用时 我们有很多选择来发出调用 在服务器上处理它们以及在客户端上处理成功和失败 有些事情显然有正确的答案 但我一直无法找到明确的指导 那么 端到端的ajax调用的正确方法是什么 包括 将 u
  • MVC3下如何给JavaScript赋值

    如何在MVC3 Razor下分配JavaScript值 我不确定它是否会起作用 谢谢你 var populate false if Session TechList null populate true 这也将起作用 if Session
  • 将点转换为经纬度

    我想知道如何获取地图点击事件坐标经纬度 这是我的代码 map on click function evt var element popup getElement var coordinate evt coordinate var latL
  • 无法导入 tweepy 模块

    我是安装新 python 模块的新手 我使用 pip install tweepy 安装了 tweepy 安装成功 并在 Lib site packages 中创建了 2 个文件夹 tweepy 和 tweepy 3 3 0 dist in
  • 创建 Matlab 运行线快捷方式(如 R)

    R 有一个很棒的快捷方式 可以运行光标当前所在的行 然后将光标移动到下一行 cmd return 在 matlab 中 您必须突出显示该行 然后运行突出显示的部分 shift F7 有没有办法创建 类似 R 的运行线快捷方式 我正在使用 O
  • 如何使用“cv2.perspectiveTransform”在Python OpenCV中的一组点上应用单应性?

    我想将单应性应用于以下几点 array 7 4894 1 8873 7 4973 1 8543 7 5375 1 6725 7 5681 1 522 7 5961 1 371 7 6252 1 2013 7 6504 1 031 7 667
  • RowAnimation 对于不同高度的单元格看起来很奇怪

    我在 UITableView 上动画删除和插入时遇到问题 事实是 我现在有不同的单元格高度 有些是 44 0 有些是 135 0 我有 uitableviewstyle 与不同的部分分组 每个部分的第一行是分组行 单击后 我将删除该部分中除
  • 如果哈希数组中的值相同,则将它们相加

    我在这篇文章中看到了这段代码 因为我试图根据某些条件对哈希数组中的值求和 Rails 对哈希数组中的值求和 https stackoverflow com questions 43087297 rails sum values in an
  • 将上下文从一个序列化器传递到另一个序列化器?

    使用 Django REST Framework 我有 2 个序列化器 PageSerializer and CommentSerializer CommentSerializer依赖于一些额外的 上下文 值 但它不会直接获取它 而是需要从
  • Ruby 相当于 virtualenv?

    有没有类似Python的工具虚拟环境 http pypi python org pypi virtualenv 基本上它允许你将Python包安装到沙盒环境中 所以easy install django不会进入系统范围的 site pack
  • MVC 路由不起作用

    在我的路由配置类中 我创建了一个自定义路由配置static prefix public static void RegisterRoutes RouteCollection routes routes MapRoute MyRoute co
  • 如何生成唯一、小、随机且用户友好的密钥?

    几个月前 我的任务是为我们的 Web 应用程序实现一个独特的随机代码 该代码必须是用户友好的并且尽可能小 但本质上仍然是随机的 因此用户无法轻松预测序列中的下一个代码 它最终生成了如下所示的值 Af3nT5Xf2 不幸的是 我对实施始终不满
  • 自动构建适合字符串集的正则表达式

    我们编写了系统来分析来自大型网络的日志消息 该系统从许多不同的网络元素获取日志消息 并通过正则表达式对其进行分析 例如 用户可能编写了两条规则 cron script sh script sh 0 9 在这种情况下 只会选择与给定模式匹配的
  • 得到一个“?”使用“std::cout”打印特殊(扩展)ASCII 字符时的输出中

    我想在控制台中打印扩展的 ascii 字符 我尝试了以下方法 std cout lt lt n std cout lt lt ID 678 Name n std cout lt lt Surname n std cout lt lt Gen
  • 循环 db intmap(person)

    example type person name string age int db person intmap person 我知道如何从数据库中获取一个人 但如何获取全部人呢 并将它们打印在 html 表中 Thx 这应该可以做到 my
  • 带边框图像的 Div

    设置一个容器 div 周围有一些边框图像 在我的例子中仅在左侧 底部和右侧 的好方法是什么 我把它放在页面顶部的中心 与其他所有内容重叠 就像 OSX 风格的下拉对话框一样 这是基本布局 这是我到目前为止所得到的 我可以避免内容的静态宽度
  • 调试量角器时 Intellij Idea 挂起

    我遇到了类似于中提到的问题这个问题 https stackoverflow com questions 22082195 cant debug protractor in webstorm it just hangs 我正在尝试在 Inte
  • .-main 表达式的含义

    这个表达的意思是什么 main 在以下情况下 size main main 这里 点 意思是 当前位置 Then main将是到 main 开始的距离 如果放在 main 的末尾 它也将是size主要的
  • 为什么我的排序实现中出现 NullPointerException?

    我正在做我的作业 我想为我的数组创建一个排序方法 但是 我在排序方法中遇到空指针错误 我不确定为什么 这是我下面的代码 public Object sorted getSetArray Arrays sort setArray return