当我使用toCharArray()方法时为什么会得到java.lang.NullPointerException?

时间:2016-03-03 14:40:54

标签: java debugging nullpointerexception

问题是Roman to Integer:link。 给定罗马数字,将其转换为整数。 输入保证在1到3999的范围内。 所以我先在答案中使用了toCharArray()方法。

public int romanToInt(String s) {
      HashMap<String, Integer> dict = new HashMap<String, Integer>();
        dict.put("I", 1);
        dict.put("V", 5);
        dict.put("X", 10);
        dict.put("L", 50);
        dict.put("C", 100);
        dict.put("D", 500);
        dict.put("M", 100);

        int sum = 0;
        char[] arrayS = s.toCharArray();
        for(int i = 0 ; i < arrayS.length ;  i++){
            int Val1 = dict.get(arrayS[i]).intValue();
            if(i < arrayS.length -1){
            int Val2 = dict.get(arrayS[i+1]).intValue();
                if(Val1 < Val2){
                    sum += Val2 - Val1;
                    i++;}
                else
                    sum += Val1;
            }
            else
                sum += Val1;
         }
         return sum;

     }

然后在位置int Val1 = dict.get(arrayS[i]);中,编译器显示Line 19: java.lang.NullPointerException。但是,如果我在没有toCharArray()的情况下重写它,它就可以工作。

int sum = 0;
        int val1, val2;
        for (int i = 0; i < s.length(); i++) {
            val1 = map.get(s.charAt(i));
            if (i < s.length()-1) {
                val2 = map.get(s.charAt(i+1));
                if (val1 >= val2) {
                    sum += val1;
                } else {
                    sum += (val2 - val1);
                    i += 1;
                }
            } else {
                sum += val1;
            }           
        }
        return sum;

使用toCharArray()时,为什么遇到java.lang.NullPointerException问题?

3 个答案:

答案 0 :(得分:0)

如果没有翻译,

dict.get(arrayS[i]);会返回null 从Integer到int的取消装箱会导致NullPointerException

答案 1 :(得分:0)

您的代码的问题在于您创建了一个HashMap,它将String映射到整数,但您将一个字符作为参数传递给romanToInt方法。 您可以通过两种方式解决问题

解决方案1 ​​ -

public int romanToInt(String s) 
{
 HashMap<String, Integer> dict = new HashMap<String, Integer>();
 dict.put("I", 1);
 dict.put("V", 5);
 dict.put("X", 10);
 dict.put("L", 50);
 dict.put("C", 100);
 dict.put("D", 500);
 dict.put("M", 100);
 int sum = 0;
 char[] arrayS = s.toCharArray();
 for(int i = 0 ; i < arrayS.length ;  i++)
 {
  int Val1 = dict.get(String.valueOf(arrayS[i])); // Convert character  to string
  if(i < arrayS.length -1)
  {
   int Val2 = dict.get(String.valueOf(arrayS[i+1])); //Convert character to string
   if(Val1 < Val2)
   {
    sum += Val2 - Val1;
    i++;
   }
   else
    sum += Val1;
  }
  else
   sum += Val1;
 }
 return sum;
}

解决方案2 -

public int romanToInt(String s) 
{
 HashMap<Character, Integer> dict = new HashMap<Character, Integer>();
 //Map Character to Integer
 dict.put('I', 1); //Used single quote to represent character
 dict.put('V', 5);
 dict.put('X', 10);
 dict.put('L', 50);
 dict.put('C', 100);
 dict.put('D', 500);
 dict.put('M', 100);
 int sum = 0;
 char[] arrayS = s.toCharArray();
 for(int i = 0 ; i < arrayS.length ;  i++)
 {
  int Val1 = dict.get(arrayS[i]);
  if(i < arrayS.length -1)
  {
   int Val2 = dict.get(arrayS[i+1]);
   if(Val1 < Val2)
   {
    sum += Val2 - Val1;
    i++;
   }
   else
    sum += Val1;
  }
  else
   sum += Val1;
 }
 return sum;
}

答案 2 :(得分:0)

实际上我在数据类型上犯了一个错误。我使用Char数组,元素是Char类型。我试图使用dict.get(arrayS[i]),因为我构建了HashMap<String, Integer>,因此arrayS [i]应该是一个String类型。 然后我将HashMap<String, Integer>更改为HashMap<Character, Integer>然后才有效。 感谢Tom @Tom指出我的问题。