【问题标题】:String Index Out of Bounds with charAt字符串索引超出范围与 charAt
【发布时间】:2018-05-09 18:18:02
【问题描述】:

作为一个学校项目,我被要求制作一个程序,显示您输入的姓名的缩写(例如。对于 Akshat Abhay Shetye,它将显示 A. A. Shetye)。

这在我的学校 PC 上运行良好,它运行旧的 bluej 和 Java,但在运行时抛出错误(StringIndexOutOfBoundsException:字符串索引超出范围)。 这是我的程序:

import java.util.*;
import java.lang.*;
public class dispInitials{
    public static void main (String args[]){
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter your full name");
        String name = sc.next();
        //name = name.trim();
        String inName= name.charAt(0)+". ";
        int i = 1;
        for(i=1;i<(name.length()-1);i++){
            if(Character.isWhitespace(name.charAt(i)))
            break;
        }
        i++;
        inName=inName+name.charAt(i)+". ";
        for(i=i;i<name.length();i++){
            if(Character.isWhitespace(name.charAt(i)))
            break;
        }
        i++;
        System.out.println("The name is "+inName);
    }
}

谁能解释错误(第 16 行)?

【问题讨论】:

  • i=i 一定是错字。

标签: java bluej


【解决方案1】:
for(i=1;i<(name.length()-1);i++)

所以,当循环停止时,i等于name.length - 1

那么,你正在做

i++;
inName = inName+name.charAt(i)+". ";

所以你正试图访问索引name.length 处的字符。但是没有这样的索引。最后一个有效索引是name.length - 1。因此例外。

您需要学习使用调试器并逐行执行代码,同时检查变量的值。或者至少在代码中添加System.out.println() 指令来诊断您的问题。这基本上是开发人员的日常工作。

【讨论】:

    【解决方案2】:

    错误在于您的姓名输入。

    用以下代码替换您的输入行:

    String name = sc.nextLine();
    

    【讨论】:

    • 这似乎解决了问题。但是为什么-String name = sc.next();-不起作用?
    • 因为可以说“Akshat Abhay Shetye”是您的输入。 sc.next() 只会从您的输入中获得“Akshat”,而“Abhay Shetye”将保持无用(直到再次调用 sc.next())。我希望它能消除你的困惑?
    • 是的。但为什么它可以在旧的 BlueJ 和 Java 上运行?(我的学校 PC)
    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多