gpt4 book ai didi

java - charAt(0) 给出 java.lang.StringIndexOutOfBoundsException

转载 作者:行者123 更新时间:2023-11-29 04:07:17 24 4
gpt4 key购买 nike

String.charAt(0) 给出 java.lang.StringIndexOutOfBoundsException 即使 String 不为空

public class Mainc {
public static void main(String[] args) {
int T;
Scanner inp = new Scanner(System.in);
Scanner inp2 = new Scanner(System.in);
T = inp.nextInt();
for (int i = 0; i < T; i++) {
String u = "";
String l = "";
String s = inp2.nextLine();
while (s != null) {
char ch = s.charAt(0);
if (Character.isLowerCase(ch))
l += ch;
else
u += ch;
s = s.substring(1);
}
if (u.length() > l.length())
System.out.println(u);
else
System.out.println(l);
}
}
}

它应该给出一个全大写的 String 或全小写的 String 取决于哪个更大或者一个全大写的 String 如果它们都是等长但它给出运行时错误 java.lang.StringIndexOutOfBoundsException即使 String 不为空并且 charAt() 函数位于索引 0。提前致谢。

最佳答案

您的 while 循环遍历字符串 s,检查每个字符,将该字符添加到 ul,然后从中删除它s。但是当所有字符都被删除时会发生什么? s 现在是空的,但是 while 循环仍然执行,因为 s 不是 null(null 和空字符串是不同的东西!)这意味着你会调用 s.charAt(0)s 为空时,导致崩溃。

要解决此问题,您可以将 while 循环条件更改为“s 不为空”。您不需要检查 s 是否为 null,因为它来自 Scanner.nextLine,它不应返回 null。

while (!s.isEmpty()) {
char ch = s.charAt(0);
if (Character.isLowerCase(ch))
l += ch;
else u += ch;
s = s.substring(1);
}

您可以通过不在每次迭代中从 s 中删除字符来进一步改进您的代码。相反,使用带有索引的 for 循环来遍历字符串。此外,在循环中连接字符串时,您应该使用 StringBuilder。这两者都将避免创建不必要的字符串对象。

StringBuilder u = new StringBuilder(); // notice the change to StringBuilder here
StringBuilder l = new StringBuilder();
String s = inp2.nextLine();

for (int j = 0 ; j < s.length() ; j ++) {
char ch = s.charAt(j);
if (Character.isLowerCase(ch))
l.append(ch);
else u.append(ch);
}

关于java - charAt(0) 给出 java.lang.StringIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57832658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com