0

私はを取得していて、NullPointerExceptionその理由を理解できません。私はここで多くの質問を読みましたが、必要な答えを得るのに十分なものを分析することができないようです。私はで作業していてHashMap、別のモジュールからそれを参照しようとしています。

コードは次のとおりです。

import java.util.*; 
@SuppressWarnings("unused")
public class Decoder 
{
    public static void main(String[] args)
    {
        decrypt();
        keywork(null);
    }

    static void decrypt()
    {
        String codedline = "ilyh wkrxvdqg, wzr kxqguhg dqg qlqhwb-wkuhh".toLowerCase();
        char[] cwarr = codedline.toCharArray();
        String dcline  = "";
        for(char x : cwarr)
        {
            if(Character.isLetter(x))
            {
                int c = (int)x;
                c = c - 3;
                if(c > 90 && c < 97)
                {
                    c += 26;
                }
                x = (char)c;
                dcline += x;
            } else
            {
                dcline += x;
            }
        }
        System.out.println(dcline);
    }

    static void keywork(String dcline)
    {
        int x;
        for(int i = 1, sw = 0; i == dcline.length(); i++)
        {
            String strchk = dcline.substring(sw, i);
            Object n = hm.get(strchk);
        };
    }


    static final HashMap<String, Integer> hm = new HashMap <String, Integer>()
    {
        /**
         * 
         */
        private static final long serialVersionUID = 2688387173090905196L;
        {
            hm.put("ONE", 1);
            hm.put("TWO", 2);
            hm.put("THREE", 3);
            hm.put("FOUR", 4);
            hm.put("FIVE", 5);
            hm.put("SIX", 6);
            hm.put("SEVEN", 7);
            hm.put("EIGHT", 8);
            hm.put("NINE", 9);
            hm.put("TEN", 10);
            hm.put("ELEVEN", 11);
            hm.put("TWELVE", 12);
            hm.put("THIRTEEN", 13);
            hm.put("FOURTEEN", 14);
            hm.put("FIFTEEN", 15);
            hm.put("SIXTEEN", 16);
            hm.put("SEVENTEEN", 17);
            hm.put("EIGHTEEN", 18);
            hm.put("NINETEEN", 19);
            hm.put("TWENTY", 20);
            hm.put("THIRTY", 30);
            hm.put("FOURTY", 40);
            hm.put("FIFTY", 50);
            hm.put("SIXTY", 60);
            hm.put("SEVENTY", 70);
            hm.put("EIGHTY", 80);
            hm.put("NINETY", 90);
            hm.put("HUNDRED", 100);
            hm.put("THOUSAND", 1000);
        }
    };
} 

これは私が得ているものです:

java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
at Decoder$1.<init>(Decoder.java:56)
at Decoder.<clinit>(Decoder.java:49)
Exception in thread "main" 
4

4 に答える 4

3

静的初期化子の「hm」を削除するだけで、hm オブジェクトはまだ存在しません! 次のようにする必要があります。

{
put("ONE", 1);
put("TWO", 2);
put("THREE", 3);
put("FOUR", 4);
put("FIVE", 5);
put("SIX", 6);
put("SEVEN", 7);
put("EIGHT", 8);
put("NINE", 9);
put("TEN", 10);
put("ELEVEN", 11);
put("TWELVE", 12);
put("THIRTEEN", 13);
put("FOURTEEN", 14);
put("FIFTEEN", 15);
put("SIXTEEN", 16);
put("SEVENTEEN", 17);
put("EIGHTEEN", 18);
put("NINETEEN", 19);
put("TWENTY", 20);
put("THIRTY", 30);
put("FOURTY", 40);
put("FIFTY", 50);
put("SIXTY", 60);
put("SEVENTY", 70);
put("EIGHTY", 80);
put("NINETY", 90);
put("HUNDRED", 100);
put("THOUSAND", 1000);
}
于 2012-07-09T20:34:21.757 に答える
2

このブロックはインスタンス初期化子です:

{
/**
     * 
     */
    private static final long serialVersionUID = 2688387173090905196L;
{
    hm.put("ONE", 1);

(ダブル{{はそれを与えます)。hm独自の初期化中に静的フィールドにアクセスしようとしています。

hm.ビットを削除して、などを実行すると機能するはずput("ONE", 1);です。

于 2012-07-09T20:34:46.250 に答える
1

私はあなたがやろうとしていることをしたことがないので、私が思うようにうまくいくかどうかはわかりませんが、何が悪いのかは正確にわかります.

宣言で匿名サブクラス構文を使用しました (おそらく偶然):

public static Something object = new Something()
{
    // anonymous subclass declaration here
}

その結果、 の初期化中にhm、それを参照します (現在hmのコンストラクターで実行しているため、初期化されていません。率直に言って、それがどのようにコンパイルされたかはわかりませんが、できるはずです以下で動作させます。

static final HashMap<String, Integer> hm;

static
{
    hm = new HashMap <String, Integer>()
    {
        private static final long serialVersionUID = 2688387173090905196L;
    }
    hm.put("ONE", 1);
    // snip
    hm.put("THOUSAND", 1000);
}
于 2012-07-09T20:39:29.920 に答える
0

本当に簡潔で純粋な機能が必要な場合は、次のコードを追加する必要があります。

public static <K, V> Map<K, V> hashMap(Object... data) {
  return fill(new HashMap<K, V>(), data);
}
public static <K, V> Map<K, V> fill(Map<K, V> map, Object... data) {
  if ((data.length & 1) != 0)
    throw new IllegalArgumentException("Odd number of key-value arguments");
  int i = 0;
  while (i < data.length) map.put((K) data[i++], (V) data[i++]);
  return map;
}

そして、次のように初期化を行います。

public static final Map<Integer, String> hm = hashMap(
  "ONE", 1,
  "TWO", 2,
  "THREE", 3,
  "FOUR", 4,
  "FIVE", 5,
  "SIX", 6,
  "SEVEN", 7,
  "EIGHT", 8,
  "NINE", 9,
  "TEN", 10,
  "ELEVEN", 11,
  "TWELVE", 12,
  "THIRTEEN", 13,
  "FOURTEEN", 14,
  "FIFTEEN", 15,
  "SIXTEEN", 16,
  "SEVENTEEN", 17,
  "EIGHTEEN", 18,
  "NINETEEN", 19,
  "TWENTY", 20,
  "THIRTY", 30,
  "FOURTY", 40,
  "FIFTY", 50,
  "SIXTY", 60,
  "SEVENTY", 70,
  "EIGHTY", 80,
  "NINETY", 90,
  "HUNDRED", 100,
  "THOUSAND", 1000
);
于 2012-07-09T20:52:20.663 に答える