【问题标题】:String index out of range on space bar character空格键字符上的字符串索引超出范围
【发布时间】:2020-08-13 09:15:32
【问题描述】:

例如,名称 Donald trump(12 个字符)导致错误字符串索引超出范围 7(找到空格的位置),即使名称 Donald trump 更长。

package test;

import javax.swing.JOptionPane;

public class Usernamesubstring {

    public static void main(String[] args) {
        String fullname = JOptionPane.showInputDialog("What is your full name");
        int breakbetween = fullname.lastIndexOf(" ");
        String firstnamess = fullname.substring(breakbetween - 3, breakbetween);
        int length = fullname.length();
        String lastnamess = fullname.substring(length - 3, length);
        String firstnamec = firstnamess.substring(0, 0);
        String lastnamec = lastnamess.substring(breakbetween + 1, breakbetween + 1 );
        firstnamec = firstnamec.toUpperCase();
        lastnamec = lastnamec.toUpperCase();
        String firstname = firstnamess.substring(1,3);
        String lastname = firstnamess.substring(1,3);
        firstname = firstnamec + firstname;
        lastname = lastnamec + lastname;
        System.out.println(firstname + lastname);
}
}

线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:7 在 java.lang.String.substring(String.java:1963) 在 test.Usernamesubstring.main(Usernamesubstring.java:14)

【问题讨论】:

  • 哪个like会抛出异常?
  • 你能解释一下你的意思,但我认为错误来自 .lastIndexOf 第 2 行
  • 顺便说一句。请想出一些合理的变量名。我看不出firstnamessfirstnamecfirstname 之间没有区别——这让人无法理解代码应该做什么。
  • 当您收到错误时,它会告诉您它发生在哪一行代码中。只需阅读整个错误。或者至少将其复制/粘贴到问题中。
  • 线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:test.Usernamesubstring.main(Usernamesubstring) 的 java.lang.String.substring(String.java:1963) 的 7 .java:14)

标签: java string substring lastindexof string-function


【解决方案1】:

你让它变得比它需要的更复杂。可以使用String.split 来制作一个简单的解决方案(它根据分隔符将字符串划分为较小的字符串数组,例如"Donald Trump".split(" ") == {"Donald", "Trump"}
完整代码


class Usernamesubstring // change that since it no longer uses substrings
{
    public static void main (String[] args)
    {
        String fullName = "Donald Trump";
        String[] parts = fullName.split(" ");
        String firstName = parts[0];               // first item before the space
        String lastName = parts[parts.length - 1]; // last item in the array
        
        System.out.println(firstName + " " + lastName);
    }
}

【讨论】:

    【解决方案2】:

    有时独立于您的索引

    String fullName = "Donald Trump";
    String[] result = fullName.split (" ");
    

    结果你现在会发现 结果 [0] ==> 唐纳德 结果 [1] ==> 特朗普

    这对您的项目来说不是更容易吗?

    【讨论】:

      【解决方案3】:

      您的错误应该出现在 String lastnamec = lastnamess.substring(breakbetween + 1, breakbetween + 1 ); 行中,因为 lastnamess 是来自fullname.substring(length - 3, length); 的长度为 3 的字符串,并且对于“Donald Trump”,breakbetween 大于 3,其中空格是字符 6。

      你应该稍微简化一下你的代码,这样更容易阅读和发现问题。

      【讨论】:

        【解决方案4】:

        tl;dr:当您尝试访问超过其长度或不包含在字符串中的索引处的字符串时会发生异常(负值)。

        关于您的方法:提示完整的名称通常不是一个好主意,因为人们往往会输入奇怪的东西或混淆顺序。更好地分别提示名字和姓氏。

        假设有人用Firstname Lastname 输入他的名字,你就不必把子字符串弄得一团糟,Java 有一些不错的特性:

            String name = "Mario Peach Bowser";
            name = name.trim();
            String[] parts = name.split(" ");
            String lastname = parts[parts.length-1];
            String firstname = name.replace(lastname, "").trim();
            System.out.println("Hello "+firstname+", your last name is: "+lastname);
        

        在这种情况下,我使用trim() 函数删除开头和结尾的空格,并在出现空格时拆分字符串。由于人们可以有一些中间名之类的东西,我只需将原始输入字符串中的姓氏替换掉,再次调用trim(),然后你就可以提取所有内容了。

        如果你真的想要一个子字符串的方法,下面的方法会起作用:

            String lastname = name.substring(name.lastIndexOf(" ")).trim();
            String firstname = name.substring(0,name.lastIndexOf(" ")).trim();
        

        您通常不存储索引变量。但是每个变体都需要某种错误检查,您可以使用try{}catch() 或在解析前检查String

        【讨论】:

          【解决方案5】:

          只有这些行是必需的。

          String[] nameArr = fullname.split(" ");
          String lastN = nameArr[nameArr.length - 1];
          int lastIndexOf = fullname.lastIndexOf(lastN);
          String firstN = fullname.substring(0, lastIndexOf);
          System.out.println(firstN + " " + lastN);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-13
            • 1970-01-01
            • 1970-01-01
            • 2010-10-31
            • 2016-02-19
            • 2012-03-02
            • 2016-02-10
            相关资源
            最近更新 更多