space 条字符的字符串索引超出范围

String index out of range on space bar character

例如,名称 Donald trump(12 个字符)会导致错误字符串索引超出范围 7(找到 space 的位置),即使名称 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);
}
}

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

你让它变得比需要的更复杂。一个简单的解决方案可以使用 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);
    }
}

有时独立于您的索引

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

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

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

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() 函数删除开头和结尾的白色 space,并在出现白色 space 时拆分字符串。由于人们可以有一些中间名和其他东西,我只是从原始输入字符串中替换姓氏,再次调用 trim() 然后你就提取了所有内容。

如果您确实需要子字符串方法,以下方法可行:

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

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

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

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

只需要这些行。

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);