2

我在使用 String 类的 replaceAll API 时遇到了空指针异常。

然后我尝试在下面粘贴小片段,我得到了 NPE。

    String s = "HELLO @WORLD@ I AM.";
    System.out.println(s.replaceAll("@WORLD@", null)) ; 

我也在 String.java 类中发现了

  public Matcher appendReplacement(StringBuffer sb, String replacement) {
        .......//code

        while (cursor < replacement.length()) { ..//code}
        .......//code
}

所以这里它调用replacement.length()这是 NPE 的原因。

是否有我们不能将第二个参数作为空值传递的规则?

我知道如果您的替换词为空,JVM 将替换什么。

4

3 回答 3

7

用空字符串而不是空字符串替换字符串。s.replaceAll("@WORLD@", "" )

于 2013-10-18T07:38:58.283 回答
2

你可以看到空 jls-4

s.replaceAll("@WORLD@", null); //NPE

什么是空?

The null type has one value, the null reference, represented by the null literal null. 
It is nothing.  

replaceAll()第二个参数是 String 不能是null因为null什么都不是

 public String replaceAll(String regex, String replacement)
                                          ↑

所以,你必须纠正这个电话

s.replaceAll("@WORLD@", ""); // "" empty String  
于 2013-10-18T07:54:12.927 回答
0

您不能在此处传递 null,因为在替换时,Matcher类会尝试检查新单词的长度以将 char 替换为 char。如果你想在你的字符串中看到,你可以输入“null”。

于 2013-10-18T07:44:35.337 回答