Java罗马到整数:空指针
有人知道我的指针(值)有什么问题吗? 线程“main”java.lang.NullPointerException中出现异常 我的节目:Java罗马到整数:空指针,java,Java,有人知道我的指针(值)有什么问题吗? 线程“main”java.lang.NullPointerException中出现异常 我的节目: import java.util.LinkedHashMap; public class Solution { private static LinkedHashMap<String, Integer> romanToNum = new LinkedHashMap<String, Integer>(); static
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;
}
}
import java.util.LinkedHashMap;
公共类解决方案{
私有静态LinkedHashMap romanToNum=新LinkedHashMap();
静止的{
罗曼托努姆.普特(“M”,1000);
罗曼托努.普特(“D”,500);
罗曼托努姆.普特(“C”,100);
罗曼托努姆.普特(“L”,50);
罗曼托努姆.普特(“X”,10);
罗曼托努姆.普特(“V”,5);
罗曼托努姆.普特(“I”,1);
}
公共int-romanToInt(字符串s){
整数和=0;
char prev='#';
对于(int i=s.length()-1;i>=0;i--){
char ch=s.charAt(i);
***int值=romantonim.get(ch)***
if(值
您的映射类型为
,但您正在使用字符
原语作为键(用于查找):
这些将自动装箱到与String
s不兼容的Character
对象。因此,正如其他人所注意到的,您的映射返回一个null整数
,该整数自动取消绑定到一个基元int
,正是这个操作导致NPE被抛出
解决方案1:将地图改为
类型
解决方案2:将违规行更改为:
***int value = romanToNum.get(String.valueOf(ch));***
您的映射类型为
,但您正在使用char
原语作为键(用于查找):
这些将自动装箱到与String
s不兼容的Character
对象。因此,正如其他人所注意到的,您的映射返回一个null整数
,该整数自动取消绑定到一个基元int
,正是这个操作导致NPE被抛出
解决方案1:将地图改为
类型
解决方案2:将违规行更改为:
***int value = romanToNum.get(String.valueOf(ch));***
问题是您正在使用
字符
调用get,该字符自动装箱为字符
char ch = s.charAt(i);
int value = romanToNum.get(ch);
由于没有使用
字符
键实际存储数据,因此会返回null
。正如其他人所指出的,null
整数
会自动取消绑定到int
,从而导致空点异常
问题是,您正在使用字符
调用get,该字符会自动绑定到字符
char ch = s.charAt(i);
int value = romanToNum.get(ch);
由于没有使用
字符
键实际存储数据,因此会返回null
。正如其他人所指出的,null
整数
自动取消绑定为int
,导致NullPointerException
正如我的映射一样,我使用char作为键。使用字符串而不是字符:
String str=String.valueOf(ch)
NullPointerException通常有两种方法:
1.无初始化
2.使用空值进行比较、计算和传输。正如我的映射一样,我使用char作为键。使用字符串而不是字符: String str=String.valueOf(ch) NullPointerException通常有两种方法: 1.无初始化 2.使用空值进行比较、计算和传输。导入java.util.* 公共类Roman_到_整数{
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(字符串x){
字符串str[]=新字符串[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”);
返回str[11];
}
公共静态void main(字符串参数[]){
扫描仪输入=新扫描仪(系统输入);
Roman_to_Integer obj=新的Roman_to_Integer();
字符串Temp=“”;
系统输出打印(“输入号码:”);
int Num=in.nextInt();
对于(inti=1;iimportjava.util.*
公共类Roman_到_整数{
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(字符串x){
字符串str[]=新字符串[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”);
返回str[11];
}
公共静态void main(字符串参数[]){
扫描仪输入=新扫描仪(系统输入);
Roman_to_Integer obj=新的Roman_to_Integer();
字符串Temp=“”;
系统输出打印(“输入号码:”);
int Num=in.nextInt();
对于(int i=1;i NPE从哪一行提交?您如何调用romanToInt
方法?NPE从哪一行提交?您如何调用romanToInt
方法?是的,我也是。在同一行代码上有两个严重错误是不寻常的。但是,如果试图查找char 在键为String
的映射中?不!map.get()
将Object
作为参数,而不是K
。不幸的是,此API决策会导致与此处类似的运行时错误,但它也允许您调用.get()
在Java 2中创建的MapMap在泛型之前,所以签名最初是Object get(Object key)
。一旦协变函数返回,它就被更改为V get(Object key)