Java Anagramanager程序不同区域出现空指针异常错误
我在代码中的几个不同位置收到一个nullpointer异常。我肯定我忘记了某个地方有个例外,但我需要一些帮助来指出它。我有3个文件要和整个程序一起使用。我正在基于给定的主文件创建一个语法分析器 这是第一类单词Java Anagramanager程序不同区域出现空指针异常错误,java,anagram,Java,Anagram,我在代码中的几个不同位置收到一个nullpointer异常。我肯定我忘记了某个地方有个例外,但我需要一些帮助来指出它。我有3个文件要和整个程序一起使用。我正在基于给定的主文件创建一个语法分析器 这是第一类单词 import java.util.*; public class Word implements Comparable<Word> { private String word; private String canonical; public Word(S
import java.util.*;
public class Word implements Comparable<Word>
{
private String word;
private String canonical;
public Word(String word)
{
String lowerCase = word.toLowerCase();
word = lowerCase;
canonical = CanonicalForm(word);
}
public String getWord()
{
return word;
}
public String getForm()
{
return canonical;
}
public String toString()
{
return "[" + word + "=" + canonical + "]";
}
public int compareTo(Word someWord)
{
return getForm().compareTo(someWord.getForm());
}
private static String CanonicalForm(String word)
{
if(word == null || word.length() < 1)
{
throw new IllegalArgumentException();
}
char arr[] = word.toCharArray();
Arrays.sort(arr);
return new String(arr);
}
}
import java.util.*;
公共类Word实现了可比较的
{
私有字符串字;
私有字符串规范;
公共字(字符串字)
{
String lowerCase=word.toLowerCase();
字=小写;
canonical=规范形式(word);
}
公共字符串getWord()
{
返回词;
}
公共字符串getForm()
{
返回规范;
}
公共字符串toString()
{
返回“[”+单词+”=“+规范+”]”;
}
公共整数比较(Word someWord)
{
返回getForm().compareTo(someWord.getForm());
}
私有静态字符串规范格式(字符串字)
{
if(word==null | | word.length()<1)
{
抛出新的IllegalArgumentException();
}
char arr[]=word.toCharArray();
数组。排序(arr);
返回新字符串(arr);
}
}
这里是anagrammager,它处理主文件夹上的大部分工作
import java.util.*;
public class AnagramManager
{
private Word[] words;
private Random rand;
private Map<String,Set<String>> theMap;
public AnagramManager(List<String> list)
{
if (list == null || list.size() < 1)
{
throw new IllegalArgumentException();
}
rand = new Random();
words = new Word[list.size()];
theMap = new TreeMap<String,Set<String>>();
makeWords(list);
makeAnagrams();
}
public void sortByWord()
{
for (Word i : words)
{
i.getWord();
}
Arrays.sort(words);
}
public void sortByForm()
{
for(Word c : words)
{
c.getForm();
}
Arrays.sort(words);
}
public String getAnagram(String word)
{
String canonWord = CanonicalForm(word);
if(theMap.containsKey(canonWord))
{
Set<String> anagramSet = theMap.get(canonWord);
String[] match = anagramSet.toArray(new String[anagramSet.size()]);
return match[rand.nextInt(match.length)];
}
else
{
return "";
}
}
public Set<String> getAnagrams(String word)
{
String canonWord = CanonicalForm(word);
boolean hasAnagram = theMap.containsKey(canonWord);
Set<String> anagrams = (hasAnagram) ? theMap.get(canonWord) : new TreeSet<String>();
return anagrams;
}
public String toString()
{
String printWords = "";
int length = words.length;
if (length < 1)
{
printWords += "[]";
}
else
{
for (int i=0; i < length; i++)
{
printWords += words[i];
}
printWords += "[...]";
for(int i = length - 5; i < length; i++)
{
printWords += words[i];
}
}
return printWords;
}
private static String CanonicalForm(String word)
{
if(word == null || word.length() < 1)
{
throw new IllegalArgumentException();
}
char arr[] = word.toCharArray();
Arrays.sort(arr);
return new String(arr);
}
private void makeWords(List<String> list)
{
int ind = 0;
for (String orgWord : list)
{
words[ind] = new Word(orgWord);
ind++;
}
}
private void makeAnagrams()
{
for(Word i : words)
{
String canon = i.getForm();
String org = i.getWord();
if(!theMap.containsKey(canon))
{
Set<String> set = new TreeSet<String>();
set.add(org);
theMap.put(canon,set);
}
else
{
theMap.get(canon).add(org);
}
}
}
}
import java.util.*;
公共类语法分析器
{
私有词[]词;
私有随机兰德;
私人地图专题地图;
公共语法管理器(列表)
{
if(list==null | | list.size()<1)
{
抛出新的IllegalArgumentException();
}
rand=新随机数();
单词=新词[list.size()];
theMap=新树映射();
makeWords(列表);
造字谜();
}
公共无效sortByWord()
{
for(单词i:单词)
{
i、 getWord();
}
数组。排序(单词);
}
公共无效排序形式()
{
for(单词c:单词)
{
c、 getForm();
}
数组。排序(单词);
}
公共字符串getAnagram(字符串字)
{
字符串canonWord=规范格式(word);
if(主题地图containsKey(canonWord))
{
设置anagramSet=map.get(canonWord);
字符串[]匹配=anagramSet.toArray(新字符串[anagramSet.size()]);
返回匹配[rand.nextInt(match.length)];
}
其他的
{
返回“”;
}
}
公共集getAnagrams(字符串字)
{
字符串canonWord=规范格式(word);
布尔hasAnagram=theMap.containsKey(canonWord);
Set anagrams=(hasAnagram)?map.get(canonWord):new TreeSet();
返回字谜;
}
公共字符串toString()
{
字符串printWords=“”;
int-length=words.length;
如果(长度<1)
{
打印字+=“[]”;
}
其他的
{
for(int i=0;i
这是主要节目。这根本不应该被修改
import java.util.*;
import java.io.*;
public class AnagramMain {
public static final String DICTIONARY_FILE = "dictionary.txt";
public static void main(String[] args) throws FileNotFoundException {
System.out.println("Welcome to the CS145 Anagram Practice");
System.out.println();
// open the dictionary file and read dictionary into an ArrayList
Scanner input = new Scanner(new File(DICTIONARY_FILE));
Scanner keyboard = new Scanner(System.in);
List<String> dictionary = new ArrayList<String>();
while (input.hasNext()) {
dictionary.add(input.next().toLowerCase());
}
// set up the AnagramManager
List<String> dictionary2 = Collections.unmodifiableList(dictionary);
AnagramManager catalog = new AnagramManager(dictionary2);
// Start the program asking for run style
System.out.println("Press enter to start, or any other input for debug mode");
String DEBUG = keyboard.nextLine();
// If in DEBUG mode
if (!DEBUG.equals("") )
{
System.out.println("** The first and last five sorted by word elements are **");
catalog.sortByWord();
System.out.println(catalog);
System.out.println("** The first and last five sorted by form elements are **");
catalog.sortByForm();
System.out.println(catalog);
System.out.println("\n\n\n");
}
// Start the Loop
getAnagram(keyboard, catalog);
}
// Executes the primary anagram loop
public static void getAnagram(Scanner console, AnagramManager theCatalog)
{
String input;
System.out.println("Please type in a word to anagram or QUIT to quit :");
input = console.nextLine();
while (!input.toUpperCase().equals("QUIT") && !input.equals("") )
{
String result = theCatalog.getAnagram(input);
if (!result.equals("") )
{
System.out.print("One possible anagram of your word " + input );
System.out.println(" is " +result);
}
else
{
System.out.println("Your word was not found in the list");
}
System.out.print("In fact the list of anagrams for your word are : ");
System.out.println(theCatalog.getAnagrams(input));
System.out.println("Please type in a word to anagram or QUIT to quit :");
input = console.nextLine();
}
}
}
import java.util.*;
导入java.io.*;
公共级语法分析{
公共静态最终字符串字典\u FILE=“DICTIONARY.txt”;
公共静态void main(字符串[]args)引发FileNotFoundException{
System.out.println(“欢迎使用CS145字谜练习”);
System.out.println();
//打开字典文件并将字典读入ArrayList
扫描仪输入=新扫描仪(新文件(字典文件));
扫描仪键盘=新扫描仪(System.in);
列表字典=新的ArrayList();
while(input.hasNext()){
add(input.next().toLowerCase());
}
//设置语法分析器
列表字典2=集合。不可修改列表(字典);
语法管理器目录=新的语法管理器(字典2);
//启动程序,询问运行方式
System.out.println(“按enter键启动,或按调试模式的任何其他输入”);
字符串调试=keyboard.nextLine();
//如果处于调试模式
如果(!DEBUG.equals(“”)
{
System.out.println(“**按单词元素排序的前五个和后五个是**”);
catalog.sortByWord();
系统输出打印LN(目录);
System.out.println(“**按表单元素排序的前五个和后五个是**”);
catalog.sortByForm();
系统输出打印LN(目录);
System.out.println(“\n\n\n”);
}
//开始循环
getAnagram(键盘、目录);
}
//执行主字谜循环
公共静态无效获取语法图(扫描仪控制台、语法管理器目录)
{
字符串输入;
System.out.println(“请键入一个单词以进行拼音或退出以退出:”);
input=console.nextLine();
而(!input.toUpperCase().equals(“退出”)&&!input.equals(“”)
{
字符串结果=catalog.getAnagram(输入);
如果(!result.equals(“”)
{
System.out.print(“一个可能的单词拼音”+输入)
Exception in thread "main" java.lang.NullPointerException
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at AnagramManager.makeAnagrams(AnagramManager.java:129)
at AnagramManager.<init>(AnagramManager.java:21)
at AnagramMain.main(AnagramMain.java:28)
this.word = lowerCase;