Я пишу английский Морзе переводчик и каждый раз, когда я бегу он появляется сообщение об ошибке:NullPointerException при индексировании HashMap с характером
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.concat(Unknown Source)
at Code.translate(Code.java:49)
at Code.<init>(Code.java:34)
at Morse.main(Morse.java:8)
Я пытался отладки. Вот функция с проблемой:
String translate(String phrase, HashMap map) { // line 37
//String to contain the morse code
String morse = "";
//Char array to contain the English phrase
char[] phraseList = new char[(int)phrase.length()];
//Fill the char array
phraseList = phrase.toCharArray();
//Loop through the array and concat the morse string with the value returned from the key
for (int x =0; x < phrase.length(); x++) {
if(phraseList[x] == ' ') {
morse.concat(" ");
} else {
//Here's where the error is produced
morse.concat((String) map.get(phraseList[x]));
}
}
return morse;
}
Ошибка возникает, когда код достигает условия «else». Вот конструктор, который устанавливает мой HashMap, который передается этой функции:
HashMap<String,String> codeMap = new HashMap<>();
//Gets passed a string phrase from the main class
public Code(String phrase) throws FileNotFoundException { //line 14
String filePath;
String letter;
String code;
//Creates the object that reads the file location
Scanner fileLocate = new Scanner(System.in);
System.out.println("Enter file path of morse code");
//Object reads file location
filePath = fileLocate.nextLine();
//Create file object
filePath=filePath.replace("\\","/");
File morse = new File(filePath);
//Create scanner object that reads the file
Scanner fileRead = new Scanner(morse);
//Loop to read the file and store the info as a key/value pair in a hashmap
while (fileRead.hasNext()) {
letter = fileRead.next().toLowerCase();
code = fileRead.next();
codeMap.put(letter, code);
}
translate(phrase,codeMap);
}
HashMap
полна правильных, строчных значений и char
массив полон строчных символов фразы, но по какой-то причине он по-прежнему вызывает ошибку. Любые советы о том, что я делаю неправильно, будут очень признательны.
Подсказка: эта линия содержит 3 потенциальные причины, которые могут вызвать NPE. Итак, начните с ** рассечения ** этих утверждений, чтобы понять, какой из объектов, которые вы используете, на самом деле является нулевым. – GhostCat
Не могли бы вы рассказать нам, какой номер строки «Код» и «Переводить» начинаются? – Addison
И намек на качество кода: конструкторы ** никогда не делают «настоящую работу». Используйте их для создания новых объектов, а не для открытия файлов, чтения содержимого и перевода. Вместо этого вы помещаете в свой класс множество небольших методов, чтобы делать все это. Бонус включал: если вы это сделаете, неожиданно вы сможете ** проверить ** все эти маленькие методы ... один за другим, с очень четкими возможностями и гораздо меньшими усилиями. Короче говоря: читайте о https://en.wikipedia.org/wiki/SOLID_(object-oriented_design) ... и особенно ** SRP **. – GhostCat