2016-03-03 102 views
-2

問題是羅馬整數:link。 給定一個羅馬數字,將其轉換爲整數。 輸入保證在1到3999的範圍內。 所以我在我的答案中首先使用了toCharArray()方法。當我使用toCharArray()方法時,爲什麼會得到java.lang.NullPointerException?

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問題?

+1

當你調試這個時,哪個對象是'null'?你期望該物體被分配一個值? – David

+5

可能是因爲's'本身是'null'。 – user2004685

+3

爲了清楚這一點:你真的認爲,當你問一個帶'String'的地圖作爲返回除null之外的其他關鍵字的地圖時,當你問它是否包含某個'char'時?你爲什麼這麼認爲? – Tom

回答

0

您的代碼存在的問題是您創建了一個將String映射到整數的HashMap,但是您將一個字符作爲參數傳遞給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; 
} 
+0

是的你是對的,我也只是想通了,我會接受你的答案。 – JiPanNYC

0

dict.get(arrayS[i]);如果沒有翻譯,則返回null。
從Integer到int的空箱拆箱導致NullPointerException

+0

謝謝你的建議。我忘了做改造。然後我編輯它像'int Val1 = dict.get(arrayS [i])。intValue();'。但我仍然遇到'NullPointerException'。 :( – JiPanNYC

+0

OP在替代方法中完全相同 –

+0

是的,我想這可能不是轉換問題。在第二種方法中,我沒有做任何轉換並且仍然有效,但是在拆箱時更好地轉換 – JiPanNYC

0

其實我做的數據類型的錯誤。我使用了元素爲Char類型的Char數組。我試圖使用dict.get(arrayS[i])陣列[我]應該是一個字符串類型,因爲我建立了這個HashMap<String, Integer>。 然後我將HashMap<String, Integer>更改爲HashMap<Character, Integer>然後它工作。 感謝Tom @Tom指出我的問題。

相關問題