字符串索引超出空格键字符的范围

问题描述

例如,唐纳德·特朗普(12个字符)名称使错误字符串索引超出范围7(在其中找到了空格),即使唐纳德·特朗普的名称更长。

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] ==>特朗普

您的项目难道不是那么容易吗?

,

您的错误应该在 String lastnamec = lastnamess.substring(breakbetween + 1,breakbetween + 1 );行中,因为姓氏是fullname.substring(length - 3,length);的长度为3的字符串,并且对于“唐纳德·特朗普”而言,分界点大于3,其中空格为字符6。

您应该稍微简化一下代码,使其更易于阅读和查找问题。

,

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

,

只需要这些行。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...