Java从文本文件填充两个数组时出现空指针异常求排查
兄弟,我来帮你捋捋这个空指针异常的问题!你要做的是统计文本文件里的单词出现次数,用两个数组分别存储单词和对应计数,但代码跑起来抛出了空指针异常,大概率是这几个地方出了问题:
数组未初始化
如果你只是声明了String[] words;或者Integer[] counts;但没有给它们分配内存空间(比如new String[初始大小]),那这两个数组默认是null状态。一旦你尝试访问数组的元素或者调用数组的属性(比如length),立刻就会触发空指针异常。Java里引用类型变量默认值都是null,必须先完成初始化才能使用。数组扩容逻辑有漏洞
数组是固定长度的,当你要添加新单词但数组已经满了的时候,如果手动扩容的逻辑没写对,比如原数组还是null就去访问words.length,或者新数组创建后没有正确复制原有元素,都会引发空指针。比如你写了words = new String[words.length + 1];,但此时words是null,words.length这一步就会直接报错。读取的单词为空或数组元素为空时的判断问题
如果你从文件里读取到了null(比如文件已经读完还继续读取),然后把这个null存入字符串数组,之后搜索单词时直接调用words[i].equals(currentWord),这时候words[i]是null,调用equals方法就会抛出空指针异常。
给你几个解决思路:
正确初始化数组并维护有效元素数量
先给数组设置一个合理的初始大小,同时用一个变量记录当前已经使用的数组位置,比如:String[] words = new String[100]; // 初始大小设为100 Integer[] counts = new Integer[100]; int currentSize = 0; // 记录已存储的单词数量搜索单词时,先判断
words[i] != null再进行equals比较,避免空指针。替换成HashMap(更推荐)
其实你这个需求完全可以用HashMap<String, Integer>来实现,它天生就是用来处理“键-值”映射的场景,不仅不用操心数组扩容的问题,逻辑也更简洁:HashMap<String, Integer> wordCounter = new HashMap<>(); // 假设你读取到了一个单词word if (wordCounter.containsKey(word)) { wordCounter.put(word, wordCounter.get(word) + 1); } else { wordCounter.put(word, 1); }这样根本不会出现数组相关的空指针问题,后期要遍历单词和计数也更方便。
内容的提问来源于stack exchange,提问作者Sara Shall

