【问题标题】:endIndex is lesser than the length of this String object substringendIndex 小于此 String 对象子字符串的长度
【发布时间】:2018-03-27 01:48:32
【问题描述】:

我有一个像下面这样的字符串

String s = "John21071989Bangalore";

Class Person {
  String name;
  Long dob;
  String city;
  ....
}

我有一个 bean,拆分字符串并将值设置为 Bean。

Person p = new Person();
p.setName(s.subString(0,4)); //John
p.setDob(Long.ParseLong(s.subString(4,12))); //2071989
p.setCity(s.subString(12,21));//Bangalore

现在我的问题是如果子字符串 endIndesx 小于长度给出错误。我想将 dob 值作为 null insted 错误。

String s1 = "John2107    Bangalore";

Person p = new Person();
p.setName(s.subString(0,4)); //John
p.setDob(Long.ParseLong(s.subString(4,12))); //this should be null 
p.setCity(s.subString(12,21));//Bangalore

【问题讨论】:

  • 长度与任何事物有什么关系?错误是因为空格

标签: java string substring


【解决方案1】:
String s = "John21071989Bangalore";

    Pattern pattern = Pattern.compile("(?<name>[a-zA-Z]+)(?<dob>\\d*)\\s*(?<city>[a-zA-Z]+)");
    Matcher m = pattern.matcher(s);
    Person p = new Person();
    if (m.find()) {
        p.setName(m.group("name"));
        String dob = m.group("dob");
        if (dob != null && !dob.trim().isEmpty())
            p.setDob(Long.valueOf(dob.trim()));
        p.setCity(m.group("city"));
    }

【讨论】:

    【解决方案2】:

    对于第二种情况,您有:

    String s1 = "John2107    Bangalore";
    

    根据这条指令:

    p.setDob(Long.ParseLong(s.subString(4,12))); //this should be null 
    

    您正在尝试将空格解析为一个数字,所以这会给您一个例外。

    您可以验证该行或将块包围成一个 try-catch:

    也许这样的事情可以帮助你:

    创建一个名为“parseDob”的方法:

    public Long parseDob(String val) {
       try {
          return Long.ParseLong(val);
       } catch (NumberFormatException e) {
          return null;
        }
    }
    

    然后你可以继续使用你的代码:

    Person p = new Person();
    p.setName(s.subString(0,4)); //John
    p.setDob(parseDob(s.subString(4,12)));
    p.setCity(s.subString(12,21));//Bangalore
    

    【讨论】:

      【解决方案3】:

      有两种子串方法:

      1.substring(int beginIndex)

      2.substring(int beginIndex, int endIndex)

      第二个是您使用的那个。它基本上获取从 beginIndex 到 endIndex 的子字符串。

      示例:“abcdefg”.substring(2,4); // return 'cd' c 是开始索引并包含在内。但是,不包括在此示例中表示“e”的 endIndex 4。当您尝试使用此方法获取从开始索引到字符串结尾的子字符串时,您必须输入大于字符串长度的 endindex,这会产生异常。这正是你正在做的。

      不要使用第二种方法,而是使用第一种方法。它只是获取从给定索引到字符串末尾的子字符串。

      示例:“abcdefg”.substring(2); // 返回“cdefg”

      总之,你的代码应该如下所示:

      Person p = new Person();
      p.setName(s.subString(0,4)); //John
      p.setDob(Long.ParseLong(s.subString(4,12))); //2071989
      p.setCity(s.subString(12));//Bangalore
      

      【讨论】:

        猜你喜欢
        • 2021-11-23
        • 2015-02-03
        • 1970-01-01
        • 2020-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多