2016-07-08 2 views
1

Я пишу английский Морзе переводчик и каждый раз, когда я бегу он появляется сообщение об ошибке: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 массив полон строчных символов фразы, но по какой-то причине он по-прежнему вызывает ошибку. Любые советы о том, что я делаю неправильно, будут очень признательны.

+0

Подсказка: эта линия содержит 3 потенциальные причины, которые могут вызвать NPE. Итак, начните с ** рассечения ** этих утверждений, чтобы понять, какой из объектов, которые вы используете, на самом деле является нулевым. – GhostCat

+0

Не могли бы вы рассказать нам, какой номер строки «Код» и «Переводить» начинаются? – Addison

+0

И намек на качество кода: конструкторы ** никогда не делают «настоящую работу». Используйте их для создания новых объектов, а не для открытия файлов, чтения содержимого и перевода. Вместо этого вы помещаете в свой класс множество небольших методов, чтобы делать все это. Бонус включал: если вы это сделаете, неожиданно вы сможете ** проверить ** все эти маленькие методы ... один за другим, с очень четкими возможностями и гораздо меньшими усилиями. Короче говоря: читайте о https://en.wikipedia.org/wiki/SOLID_(object-oriented_design) ... и особенно ** SRP **. – GhostCat

ответ

3

Попробуйте

morse.concat((String) map.get(Character.toString(phraseList[x]))); 
          // ^^^^^^^^^^^^^^^^^^^^ added this 

Ваша карта индексируется String но translate не знает, что из-за типа стирания. Вы индексируете char вместо String. Это означает, что вы получаете autoboxed Character, который не будет указан в String. В результате карта не будет содержать ожидаемую запись и вернет null — откуда NullPointerException.

Объяснение: Пер this answer, hashCode является первой проверки в HashMap. После этого Object.equals() используется для поиска ключа на карте. Оба String.equals(Character) и Character.equals(String) вернут false. Поэтому, хотя значения hashCode могут быть одинаковыми для String("a") и Character('a'), эти два значения не считаются равными, поэтому они не могут использоваться взаимозаменяемо как ключи.

+0

Я пробовал это, но он сказал:« Нельзя отличить из char в String ». – CS2016

+0

@ CS2016 Извините, опередив себя. Попробуйте отредактированную версию. – cxw

+0

Это сработало, спасибо! – CS2016

Смежные вопросы