Java roman to integer:null指针

时间:2014-07-07 23:30:15

标签: java

任何人都知道我的指针(值)有什么问题? 线程“main”java.lang.NullPointerException中的异常 我的节目:

import java.util.LinkedHashMap;

public class Solution {
    private static LinkedHashMap<String, Integer> romanToNum = new LinkedHashMap<String, Integer>(); 
    static{
        romanToNum.put("M", 1000);
        romanToNum.put("D", 500);
        romanToNum.put("C", 100);
        romanToNum.put("L", 50);
        romanToNum.put("X", 10);
        romanToNum.put("V", 5);
        romanToNum.put("I", 1);
    }
    public int romanToInt(String s) {
        int sum = 0;
        char prev = '#';
        for(int i = s.length()-1; i >= 0; i--){
            char ch = s.charAt(i);
            ***int value = romanToNum.get(ch);***
            if(value < sum && ch != prev){
                sum -= value;
            }else{
                sum += value;
            }
            prev = ch;
        }
        return sum;
    }
}

4 个答案:

答案 0 :(得分:3)

您的地图属于<String, Integer>类型,但您使用char原语作为键(用于查找):

char ch = s.charAt(i);
***int value = romanToNum.get(ch);***

这些对象被自动装箱到Character个对象,这些对象与<{1}}不兼容。因此,正如其他人所指出的那样,你的地图会返回一个空String,它会自动取消装箱到原始Integer,而这个操作会导致NPE被抛出。

解决方案1:改为使用int类型的地图。

解决方案2:将违规行更改为:

<Character, Integer>

答案 1 :(得分:1)

导入java.util。*;

公共类Roman_to_Integer {

public String getRomanValue(String x) {
    String str[] = new String[12];
    str[0] = x.replaceAll("IIIII", "V");
    str[1] = str[0].replaceAll("IIII", "IV");
    str[2] = str[1].replaceAll("VV", "X");
    str[3] = str[2].replaceAll("VIV", "IX");
    str[4] = str[3].replaceAll("XXXXX", "L");
    str[5] = str[4].replaceAll("XXXX", "XL");
    str[6] = str[5].replaceAll("LL", "C");
    str[7] = str[6].replaceAll("LXL", "XC");
    str[8] = str[7].replaceAll("CCCCC", "D");
    str[9] = str[8].replaceAll("CCCC", "CD");
    str[10] = str[9].replaceAll("DD", "M");
    str[11] = str[10].replaceAll("DCD", "CM");

    return str[11];
}

public static void main(String args[]) {
    Scanner in = new Scanner(System.in);
    Roman_to_Integer obj = new Roman_to_Integer();
    String Temp = "";
    System.out.print("Enter The Number : ");
    int Num = in.nextInt();
    for(int i = 1 ; i <= Num ; i++) {
        Temp = Temp + "I";
    }

    String Roman = obj.getRomanValue(Temp);

    System.out.print("The Roman Value Of "+Num+" is "+Roman);
}

}

这是最合逻辑且最简单的方法   方法getRomanValue(String x)实际上将所有“ III ....”覆盖到   各自的价值。在主要方法中,我收集了n个“ I”   用相应的值(例如“ V”或“ L”)替换了“ I”。

注意:函数/方法getRomanValue(String x)按值的升序排列,   非常重要...

答案 2 :(得分:0)

问题是您使用char来调用get,自动将其设置为Character

char ch = s.charAt(i);
int value = romanToNum.get(ch);

由于实际上没有Character个密钥存储数据,因此返回null。正如其他人所指出的那样,null Integer会自动取消装箱到int,从而产生NullPointerException

答案 3 :(得分:0)

正如我的地图所示,我用char作为关键。使用字符串而不是char: String str = String.valueOf(ch);

NullPointerException通常有两种方法: 没有初始化 2.使用null进行比较,计算,转移。