2016-08-03 14 views
-2

Ich bekomme immer eine Null-Zeiger-Ausnahme und ich kann nicht herausfinden, warum. Ich mache einige Tests und das ist, wenn ich die Null-Zeiger-Ausnahme bekomme, wenn ich es von Pangrams main() ausführe, bekomme ich überhaupt keine Probleme. Ich habe den Code, Tests und Stack-Trace unten enthalten. Jede Hilfe würde sehr geschätzt werden und danke im Voraus!Ich kann nicht herausfinden, NullPointerException, wenn ich meine Tests ausführen

import java.util.Map; 
import java.util.TreeMap; 

public class Pangrams { 
    private static TreeMap<Character, Integer> letterCount; 

    public static void main(String[] args) { 
     Pangrams pan = new Pangrams(); 
     System.out.println(pan.isPangram("the quick brown fox jumps over the lazy dog")); 
     pan.getLetterCount(); 
    } 

    public Pangrams() { 
     letterCount = new TreeMap<>(); 
     populateMap(); 
    } 

    public static boolean isPangram(String text) { 

     if(text.length() < 26) return false; 

     addToMap(text); 

     for(Map.Entry<Character, Integer> entry : letterCount.entrySet()) { 
      System.out.println(entry.getKey() + ": " + entry.getValue()); 
      if(!(entry.getValue() >= 1)) { 
       return false; 
      } 
     } 

     return true; 
    } 

    public static void populateMap() { 
     for(char x = 'a'; x <= 'z'; x++) { 
      letterCount.put(Character.valueOf(x), 0); 
     } 
    } 

    public static void addToMap(String text) { 
     char[] textArray = text.toLowerCase().replace(" ", "").toCharArray(); 
     // System.out.println(textArray.length); 

     for(char letter : textArray) { 
      if(letterCount.containsKey(letter)) { 
       int count = letterCount.get(letter); 

       letterCount.put(letter, ++count); 
       System.out.println(letterCount.get(letter)); 
      } 
      else if(!Character.isWhitespace(letter)) { 
       letterCount.put(letter, 1); 
      } 
     } 
    } 

    public static void getLetterCount() { 
     for(Map.Entry<Character, Integer> entry : letterCount.entrySet()) { 
      System.out.println(entry.getKey() + ": " + entry.getValue()); 
     } 
    } 
} 

Hier sind die Tests:

import org.junit.Test; 

import static org.junit.Assert.assertTrue; 
import static org.junit.Assert.assertFalse; 

public class PangramTest { 

    @Test 
    public void emptySentence() { 
     assertFalse(Pangrams.isPangram("")); 
    } 

    @Test 
    public void testLowercasePangram() { 
     assertTrue(Pangrams.isPangram("the quick brown fox jumps over the lazy dog")); 
    } 

    @Test 
    public void missingCharacterX() { 
     assertFalse(Pangrams.isPangram("a quick movement of the enemy will jeopardize five gunboats")); 
    } 

    @Test 
    public void mixedCaseAndPunctuation() { 
     assertTrue(Pangrams.isPangram("\"Five quacking Zephyrs jolt my wax bed.\"")); 
    } 

    @Test 
    public void nonAsciiCharacters() { 
     assertTrue(Pangrams.isPangram("Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.")); 
    } 

} 

Hier ist der vollständige Stack-Trace:

java.lang.NullPointerException 
    at Pangrams.addToMap(Pangrams.java:47) 
    at Pangrams.isPangram(Pangrams.java:24) 
    at PangramTest.testLowercasePangram(PangramTest.java:15) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:253) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
+3

Der 'Pangrams' Konstruktor wird nie aufgerufen, so' letterCount' nie instanziiert. –

+1

Randnotiz: Sie machen nur Ihre ** Kern ** -Methoden öffentlich; Diejenigen, von denen Sie möchten, dass Sie von außen genannt werden. Aber nun, da die meisten Ihrer Methoden öffentlich sind, sollten Sie auch Tests für sie schreiben. Sie sehen, wenn Ihre "ganze" Logik so kompliziert ist, dass sogar Ihre Tests Ihnen nicht helfen, Fehler zu erkennen ... dann testen Sie kleinere Einheiten (wie Ihre anderen Methoden) und sehen Sie, wie gut sie funktionieren. Die andere Sache: Sie mischen statisches und nicht-statisches Zeug. Vermeiden Sie das. Sie möchten selten, dass ein statisches Feld durch nicht statische Methoden manipuliert wird! – GhostCat

+1

Pangrams.isPangram nennen Sie es als statisch, also @JonnyHenly sagte die TreeMap letterCount wird nicht instanziiert – striker

Antwort

-1

Ok vielleicht habe ich nicht mich klar zu dieser Antwort erklären. Die Sache, die Sie falsch gemacht haben, war eine statische Methode in Ihrer Klasse aufzurufen. Durch den Aufruf statischer Methoden wird der Konstruktor nicht instanziiert. In diesem Fall initialisierten Sie Ihre Karte.

Also die NULL-Zeiger-Ausnahme wurde geworfen, weil Sie auf eine Karte zugegriffen haben, die überhaupt nicht instanziiert wurde.

Suche weiter ich glaube nicht, Sie Ihre Karte müssen in diesem Zusammenhang statisch sein, so unter meinem Code die Karte in den Zustand des Objekts hält und Refactoring Ihren Testfall den Objektstatus verwenden Sie Methoden aufrufen, da Ihre Methoden sind nicht mehr statisch und sie sind an Ihren Objektstatus gebunden.

importieren java.util.Map; importieren Sie java.util.TreeMap;

public class Pangrams 
{ 
    private final TreeMap<Character, Integer> letterCount; 

    public static void main(String[] args) 
    { 
     Pangrams pan = new Pangrams(); 
     System.out.println(pan.isPangram("the quick brown fox jumps over the lazy dog")); 
     pan.getLetterCount(); 
    } 

    public Pangrams() 
    { 
     letterCount = new TreeMap<Character, Integer>(); 
     populateMap(); 
    } 

    public boolean isPangram(String text) 
    { 

     if(text.length() < 26) 
     { 
      return false; 
     } 

     addToMap(text); 

     for(Map.Entry<Character, Integer> entry : letterCount.entrySet()) 
     { 
      System.out.println(entry.getKey() + ": " + entry.getValue()); 
      if(!(entry.getValue() >= 1)) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 

    public void populateMap() 
    { 
     for(char x = 'a'; x <= 'z'; x++) 
     { 
      letterCount.put(Character.valueOf(x), 0); 
     } 
    } 

    public void addToMap(String text) 
    { 
     char[] textArray = text.toLowerCase().replace(" ", "").toCharArray(); 
     // System.out.println(textArray.length); 

     for(char letter : textArray) 
     { 
      if(letterCount.containsKey(letter)) 
      { 
       int count = letterCount.get(letter); 

       letterCount.put(letter, ++count); 
       System.out.println(letterCount.get(letter)); 
      } 
      else if(!Character.isWhitespace(letter)) 
      { 
       letterCount.put(letter, 1); 
      } 
     } 
    } 

    public void getLetterCount() 
    { 
     for(Map.Entry<Character, Integer> entry : letterCount.entrySet()) 
     { 
      System.out.println(entry.getKey() + ": " + entry.getValue()); 
     } 
    } 
} 

Test:

import static org.junit.Assert.assertFalse; 
import static org.junit.Assert.assertTrue; 

import org.junit.Test; 

public class PangramTest 
{ 
    Pangrams pan = new Pangrams(); 

    @Test 
    public void emptySentence() 
    { 
     assertFalse(pan.isPangram("")); 
    } 

    @Test 
    public void testLowercasePangram() 
    { 
     assertTrue(pan.isPangram("the quick brown fox jumps over the lazy dog")); 
    } 

    @Test 
    public void missingCharacterX() 
    { 
     assertFalse(pan.isPangram("a quick movement of the enemy will jeopardize five gunboats")); 
    } 

    @Test 
    public void mixedCaseAndPunctuation() 
    { 
     assertTrue(pan.isPangram("\"Five quacking Zephyrs jolt my wax bed.\"")); 
    } 

    @Test 
    public void nonAsciiCharacters() 
    { 
     assertTrue(pan.isPangram("Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.")); 
    } 

} 
+0

Superbad: nur ein LKW Ladung Code und keine Erklärungen überhaupt. Ernsthaft: das ist schlecht. – GhostCat

+0

@GhostCat Ich habe mich in den Kommentaren erklärt, ich dachte, der Benutzer habe es inzwischen verstanden. Ich erklärte, was falsch ist und die Art und Weise der Verwendung von statischen nicht instanziiert den Konstruktor und ich gab den festen Code hier im Abschnitt Antworten – striker

+0

Antworten immer für sich selbst stehen. Sie erwarten niemals, dass die Leute zuerst alle Kommentare lesen, um dann herauszufinden, wie sich Ihre Antwort darauf bezieht.Also: nimm den Inhalt deiner Kommentare; und lege sie in die Antwort; dann lösche die Kommentare. So einfach ist das. – GhostCat

Verwandte Themen