字符串索引超出范围 - 为什么会发生这种情况?

时间:2016-10-07 18:23:42

标签: java

(请记住,我自己只在一个月内学习过java)

我正在尝试制作一个程序,它只是告诉你你给程序命名的最后一个字符。这是我的代码:

import java.util.Scanner;


public class LastCharacter {


public static void main(String[] args) {
    Scanner reader = new Scanner(System.in);
    System.out.println("hey");
    String name = reader.nextLine();
    lastChar(name);
}

public static char lastChar(String text) {
    char lastChar = '\0';;
    int i = 0;
    for (i = 0; i <= text.length(); i++) {
        lastChar = text.charAt(i);

    }
    System.out.println(lastChar);
    return lastChar;
}

}

Error: 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4
at java.lang.String.charAt(String.java:658)
at LastCharacter.lastChar(LastCharacter.java:19)
at LastCharacter.main(LastCharacter.java:11)

Java结果:1

我也知道这可以通过将字符串的长度减去1来实现,但我想知道为什么这种方法不起作用。我真的不知道怎么说这个,但字符串和字符不相处? (请不要取笑我)

谢谢!

5 个答案:

答案 0 :(得分:6)

Java字符串从基数索引0开始。因此,这一行:for (i = 0; i <= text.length(); i++) {正在尝试访问不存在的索引。字符串main仅从0到3.因此,当您尝试访问索引4时,您将获得越界错误。

替换此行: for (i = 0; i <= text.length(); i++) {

有了这个: for (i = 0; i < text.length(); i++) {来解决问题。

答案 1 :(得分:2)

问题是因为Java对字符串使用0索引数组。这意味着您的for循环i <= text.length()将转到最后一个字符+1。用#&#34; Joe&#34;

这样的名字

J = 0, o = 1, e = 2

&#34; Joe&#34;为3,因此循环进入索引(​​3),它超出了字符数组的范围。

答案 2 :(得分:1)

这里要注意两件事:

1。)Java String类中的 length()方法返回字符串的字符数

2.)Java数组使用零基索引

因此,要完成获取名称字符串的最后一个字符的任务:

public static char lastChar(String text) {
    int textLength = text.length();
    char lastChar = text.charAt(textLength - 1);  //first char starts from index 0
    return lastChar;
}

希望它有所帮助。

答案 3 :(得分:0)

你出界了!条件应该是: 我&lt; text.length()

for (i = 0; i < text.length(); i++) {
    lastChar = text.charAt(i);

}

答案 4 :(得分:0)

字符串是0基础,意味着第一个索引是0.所以对于字符串&#34; mom&#34;,第0个索引是&#34; m&#34;,第一个索引是&#34; o& #34;第二个指数是&#34; m&#34;。这意味着这个字符串没有第三个索引,即使它的长度是3!基于此,你的循环应该是:

for (i = 0; i < text.length(); i++) {
    lastChar = text.charAt(i);
}

但是,有一种更好的方法可以完全没有循环。我们可以简单地在字符串的最后一个索引处获取字符,而不会遍历每个字符。它不那么复杂,效率更高:

lastChar = text.charAt(text.length() - 1);