有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

导致NullPointerException的java程序

这是一个名为“Algorithm.java”的文件

package leetcode;

import java.util.HashMap;
import java.util.Map;

public class Algorithms {
    public static int romanToInteger(String roman) {
        Map<String, Integer> romanValues = new HashMap<>();

        romanValues.put("I", 1);
        romanValues.put("V", 5);
        romanValues.put("X", 10);
        romanValues.put("L", 50);
        romanValues.put("C", 100);
        romanValues.put("D", 500);
        romanValues.put("M", 1000);
        int integer = romanValues.get(Character.toString(roman.charAt(roman.length() - 1)));
        int previousValue = integer, current;

        for (int i = roman.length() - 2; i >= 0; i--) {

            current = romanValues.get(Character.toString(roman.charAt(i)));

            if (current < previousValue) {
                integer -= current;
            } else {
                integer += current;
            }

            previousValue = current;
        }
        return integer;
    }
}

这里是我调用代码的“Main.java”

package leetcode;

public class Main {
    public static void main(String[] args) {
        System.out.println(Algorithms.romanToInteger("XII"));
    }
}

我是Java新手,我不明白为什么这行代码会导致NullPointerException

int integer = romanValues.get(roman.charAt(roman.length() - 1));

但当我转换价值观时。将get()参数设置为如下字符串

int integer = romanValues.get(Character.toString(roman.charAt(roman.length() - 1)));

它运行良好


共 (2) 个答案

  1. # 1 楼答案

    int integer = romanValues.get(roman.charAt(roman.length() - 1));

    让我们回顾一下失败代码中的操作顺序:

    1. roman.charAt(roman.length() - 1)返回roman字符串的最后一个char
    2. romanValues.get根据运行时的{}javadocan ^{}is expected这里键的特定类型已经被擦除,因此{}值被装箱到{}中,然而,由于映射是用{}键定义的,{}返回{}键,因此{}键没有找到任何内容
    3. 赋值int integer = null导致取消装箱(必须将Integer转换为原语int),而此尝试导致NullPointerException,因为nullget返回

    因此,为了让上述代码使用Character键,还可以修复romanValues映射中键的类型,并可能使用^{}为缺少的键提供默认值:

    Map<Character, Integer> romanValues = new HashMap<>();
    
    romanValues.put('I', 1);
    romanValues.put('V', 5);
    romanValues.put('X', 10);
    romanValues.put('L', 50);
    romanValues.put('C', 100);
    romanValues.put('D', 500);
    romanValues.put('M', 1000);
    
    int integer = romanValues.getOrDefault(roman.charAt(roman.length() - 1), 0);
    
  2. # 2 楼答案

    地图。获取:地图。如果指定的键为null,并且此映射不允许null键(可选),则get return返回null

    绳子。charAt(roman.charAt):返回char

    因此

    值的键(Map<;String,Integer>;)是绳子。这是char和String之间的区别

    例如

    //false
    System.out.println("A".equals('A'));