任何人都知道我的指针(值)有什么问题? 线程“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;
}
}
答案 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进行比较,计算,转移。