【问题标题】:Java Error substringJava 错误子字符串
【发布时间】:2014-10-03 08:55:44
【问题描述】:

我有这样的代码:

List<RFeeAtmbVO> list = RFeeAtmbBO.getInstance().listRFeeAtmb(mapParam, null);
if (list != null && list.size() > 0) {
  for (RFeeAtmbVO vo : list) {
    vo.setIdFeeType(edit_biaya_jenisBiayaId.getValue());
    String name = edit_biaya_name.getValue().trim();
    if (vo.getName().indexOf("(Gagal Berbayar)") > -1) {
      name = name.substring(0, name.indexOf(" (Gagal Berbayar)")) + " (Gagal Berbayar)";
      System.out.println("Hasilnya 1: "+name);
    } else {
      if (name.indexOf("(Gagal Berbayar)") > -1 ) {
        name = name.substring(0, name.indexOf(" (Gagal Berbayar)"));
        System.out.println("Hasilnya2 : "+name);
      }
    }
    vo.setName(name);
    vo.setSdate(edit_biaya_sdate.getValue());
    vo.setEdate(edit_biaya_edate.getValue());
    vo.setKodeFee(edit_biaya_kodeFee.getValue());
    vo.setMappingCode(edit_biaya_mappingCode.getValue());
    RFeeAtmbBO.getInstance().updateRFeeAtmb(vo);
  }
}

当我在没有引号的“(Gagal Berbayar)”的文本框中添加没有问题并保存在数据库中时,但添加一些没有“(Gagal Berbayar)”的文本时,我收到如下错误:

[err] java.lang.StringIndexOutOfBoundsException: String index out of range: -1
[err]   at java.lang.String.substring(String.java:1904)
[err]   at controller.fee.fee.EditBiayaController.onClick$edit_biaya_btnSave(EditBiayaController.java:413)

第 413 行是

name = name.substring(0, name.indexOf(" (Gagal Berbayar)")) + " (Gagal Berbayar)";

什么问题?可以帮帮我吗?抱歉更新代码晚了:)

【问题讨论】:

  • 我认为您只需要在 indexof 处减去 1。使用这个: substring(0, name.indexOf(" (Gagal Berbayar)")-1)
  • 请简化您的代码示例并显示一些触发问题的示例输入。有很多代码我们不需要在那里看到 - 只需关注子字符串并演示问题。
  • 哪一行报错?

标签: java string substring


【解决方案1】:

if 子句中,您首先检查vo.getName() 是否包含您的字符串(Gagal Berbayar),然后在if 计算结果为true 时在执行的块中使用不同的表达式@987654326 @ 而不是 vo.getName()。无法保证 name 包含您的字符串,因此这可能会失败。

你可以这样解决。

if (vo.getName().indexOf("(Gagal Berbayar)") > 0) {
  name = vo.getName().substring(0, vo.getName().indexOf(" (Gagal Berbayar)")) 
      + " (Gagal Berbayar)";
  System.out.println("Hasilnya 1: "+name);
}

但是,如果有人只是输入(Gagal Berbayar) 而前面没有空格怎么办?然后你的if 语句计算为true,但块内的indexOf 返回-1,因为它找不到(Gagal Berbayar)(前面有一个空格)。

所以你也应该改变它:

    String GAGAL = " (Gagal Berbayar)";

    if (vo.getName().indexOf(GAGAL) > 0) {
      name = vo.getName().substring(0, vo.getName().indexOf(GAGAL)) + GAGAL;
      System.out.println("Hasilnya 1: "+name);
    } else {
      if (name.indexOf(GAGAL) > 0 ) {
        name = name.substring(0, name.indexOf(GAGAL));
        System.out.println("Hasilnya2 : "+name);
      }
    }

【讨论】:

    【解决方案2】:

    这段代码name.indexOf(" (Gagal Berbayar)") 返回-1。

    还有negative indices are not allowed in substring method. 所以这是根本原因。

    【讨论】:

    • 我也这么认为。但是如果name 中有空格怎么办。例如 - "asdf sf".indexOf("sf")"asdf sf".indexOf(" sf")。我认为@user3562918 应该澄清name 实际包含的内容。
    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2013-12-17
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多