所以这对大学来说是一个寒假,而我正试图在编码上保持敏锐,所以我只是编写程序和算法的代码,我们只讨论但从未在课堂上编码.无论如何,我今天正在研究的是一个程序,你给计算机一个扰乱的单词,它输出所有可以从这些字母中产生的单词(来自我们给出的EnglishWordList文件).
无论如何,这是我到目前为止的代码:
import java.io.*;
import java.util.*;
public class ProdFinder {
private HashMap<Character,Integer> prodFinder = new HashMap<Character,Integer>();
private HashMap<Integer,LinkedList<String>> findWord = new HashMap<Integer,LinkedList<String>>();
private static final char[] letters = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
private static final int[] primes = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
public ProdFinder() throws FileNotFoundException {
for (int i = 0; i < letters.length; i++) {
prodFinder.put(letters[i],primes[i]);
}
Scanner sc = new Scanner(new File("EnglishWordList.txt"));
while (sc.hasNextLine()) {
String str = sc.nextLine();
int strProd = findProduct(str);
if (findWord.containsKey(strProd)) {
LinkedList<String> wordList = findWord.get(strProd);
wordList.add(str);
findWord.put(strProd,wordList);
}
else {
LinkedList<String> wordList = new LinkedList<String>();
wordList.add(str);
findWord.put(strProd,wordList);
}
}
sc.close();
}
public int findProduct(String x) {
int product = 1;
char[] str = x.tochararray();
for (Character val: str) {
product = product*prodFinder.get(val);
}
return product;
}
public void descramble(String x) {
int prod = findProduct(x);
if (findWord.containsKey(prod)) {
System.out.println("The words that can be formed from the letters in " + x + " are: " +
findWord.get(prod));
}
else {
System.out.println("No words can be formed from the letters in " + x + ".");
}
}
}
现在,错误起源于我开始将数字的所有主要产品放入我的HashMap的行(试图将每个主要产品映射到其字母乘以该数字的单词的LinkedList.)不知何故,这是抛出异常,如当我注释掉那部分代码并运行findProduct方法时,它可以正常工作,我将它输出为以黄金形式输出lettesr的产品.
有关异常来自何处的任何想法?
编辑:抱歉,堆栈跟踪如下:
Exception in thread "main" java.lang.NullPointerException at ProdFinder.findProduct(ProdFinder.java:44) at ProdFinder.<init>(ProdFinder.java:22) at Descramble.main(Descramble.java:7)
据我所知,当我尝试在str上调用findProd时,错误就出现了:
int strProd = findProduct(str);
解决方法
问题是ProdFinder.java:44,因为堆栈跟踪指示哪个是
product = product*prodFinder.get(val);
空指针异常是prodFinder没有val的产品/值,因此它返回null,程序然后尝试乘以产品.
(任何* null)导致NullPointerException
prodFinder地图没有值的原因可能是因为当所有添加到地图中的字都是小写字母字符时,该单词有一些大写字母,特殊字符或数字
Java调试器是这类问题的一个很好的资源.使用诸如eclipse或netbeans之类的IDE,只需在第44行放置一个断点即可快速找到罪魁祸首用例.