(请记住,我自己只在一个月内学习过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来实现,但我想知道为什么这种方法不起作用。我真的不知道怎么说这个,但字符串和字符不相处? (请不要取笑我)
谢谢!
答案 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);