【问题标题】:String.split returning null when using a dotString.split 在使用点时返回 null
【发布时间】:2012-07-12 12:31:51
【问题描述】:

我得到了这个简单的代码:

String ip = "1.2.3.4";
String[] ipArray = ip.split(".");
System.out.println(ipArray[1]);

ipArray 在遇到System.out.println 时为空(抛出空指针异常)。

我的问题是为什么 ipArray 保持为空,即使我将它设置为在每个 ip 的 .s 上拆分?

【问题讨论】:

  • 您正在拆分任何字符,因此所有字符都将被拆分,因为数组中没有任何内容。 string.split 采用正则表达式。
  • . 表示“任何字符” :) 你需要一个“真正的点”[.]
  • 确切地说,取决于模式 (DOTALL),. 将匹配或不匹配换行符。
  • 我可以补充一下,如果您使用的是 python,那么您几乎 100% 正确。 python split 命令按字符(或正则表达式,但默认为字符)进行拆分
  • 只是一个微小的更正 - 此代码将抛出 java.lang.IndexOutOfBoundsException 异常,而不是 NPE(如 OP 所写)。 String#split 永远不会返回 null。这里的问题是结果是一个空数组。

标签: java arrays string nullpointerexception


【解决方案1】:

我们也可以使用split("[.]")

String s = "abcd.jpg";
String[] strarry = s.split ("[.]");

strarry[0]=abcd, 星空[1]=jpg

【讨论】:

    【解决方案2】:

    使用ip.split("\\.");,您的问题将迎刃而解。问题是 String#split 接收正则表达式,点 (.) 符号是正则表达式中的特殊字符,因此您需要对其进行转义以将其解释为普通点,因为反斜杠也是转义字符在 Java 中,您也必须对其进行转义。

    【讨论】:

      【解决方案3】:

      Pattern.quote(String) 也可以用来引用整个字符串。这将返回一个将按字面解释的模式,特殊字符没有特殊含义。在这种情况下,这可能有点矫枉过正,但有时它可能很有用。

      【讨论】:

        【解决方案4】:

        .是正则表达式中的特殊字符,用于分割字符串。

        要解决此问题,您需要转义 .。这将我们引向\. 不幸的是,\ 也是 java 字符串中的一个特殊字符,因此也必须对其进行转义,以使 \\.

        我们的“最终”结果是ip.split("\\.");

        在相关问题中,整个过程可以完全避免。做标准库已经为我们做的事情是没有意义的。

        考虑以下

        byte[] ipOctets = InetAddress.getByName(ip).getAddress();
        

        这里唯一的问题是要记住,如果你想要 int 值,你必须用&int octet = ipOctets[0] & 0xFF; 一样提取它

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-18
          • 2015-12-28
          • 1970-01-01
          • 2012-05-15
          • 2014-02-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多