2016-08-03 5 views
-2

私はnullポインタの例外を取得し続けていると私は理由を把握することはできません。私はいくつかのテストを実行している、それは私がPangrams main()からそれを実行するとき、私はnullポインタの例外を得るときですが、私は何も問題は全くありません。私は以下のコード、テスト、スタックトレースを含んでいます。どんな助けでも大歓迎となり、事前に感謝します!ここで私はテストを実行するとNullPointerExceptionを見つけることができません

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()); 
     } 
    } 
} 

テストです:ここでは

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.")); 
    } 

} 

は、完全なスタックトレースです:

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

、これ' letterCount'がインスタンス化されることはありません。 –

+1

サイドノート:あなたはあなたの**コア**メソッドを公開するだけです。あなたはあなたが外から呼び出されたいものです。しかし、あなたのメソッドのほとんどが公開されているので、テストを書くことも検討してください。あなたの "全体"ロジックが非常に複雑でテストでもバグを理解するのに役立たない場合、小さなユニット(他のメソッドのようなもの)をテストして、どれくらいうまく動作するかを確認してください。もう一つは、静的なものと非静的なものを混在させることです。それを避けてください。非静的メソッドで静的フィールドを操作することはめったにありません。 – GhostCat

+1

Pangrams.isPangramこれは静的として呼び出すので、@ JonnyHenlyはTreeMap <文字、整数> letterCountがインスタンス化されていないと言っています – striker

答えて

-1

[OK]を、多分私はこの答えに明確に自分自身を説明するdidntの。 あなたが間違っていたことは、あなたのクラスで静的メソッドを呼び出すことでした。 静的メソッドを呼び出すと、マップを初期化していたコンストラクタがインスタンス化されません。

したがって、一度もインスタンス化されていないマップにアクセスしていたため、NULLポインタ例外がスローされました。

このコンテキストでは静的である必要があるとは思わないので、以下のコードはオブジェクトの状態のマップを保持し、オブジェクトの状態を使用してメソッドを呼び出すようテストケースをリファクタリングしています。もう静的ではなく、オブジェクトの状態に結びついています。

import java.util.Map; import 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()); 
     } 
    } 
} 

テスト: `Pangrams`コンストラクタが呼び出されることはありません

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

スーパーバッド:トラックの読み込みだけで、説明は全くありません。真剣に:thats **悪**。 – GhostCat

+0

@GhostCat私はコメントセクションで自分自身を説明した、私はユーザーが今理解したと思った。私は何が間違っているのか、静的なものを使ってコンストラクタをインスタンス化する方法を説明し、aswersセクションでここで固定コードを与えました。 – striker

+0

答えは常に自分自身を表しています。あなたは**人々が最初にすべてのコメントを読んでからあなたの答えがそれにどう関係しているかを理解することを期待しない**。だから:あなたのコメントの内容を取る;答えに入れてください。コメントを削除します。それは簡単です。 – GhostCat

関連する問題