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

charAt(0)给出了java.lang.StringIndexOutOfBoundsException,java,Java,String.charAt(0)给出了java.lang.StringIndexOutOfBoundsException,即使字符串不为空 public class Mainc { public static void main(String[] args) { int T; Scanner inp = new Scanner(System.in); Scanner inp2 = new Scanner(System.in);

String.charAt(0)
给出了
java.lang.StringIndexOutOfBoundsException
,即使
字符串不为空

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); 
        }
    }
}
公共类Mainc{
公共静态void main(字符串[]args){
int T;
扫描仪inp=新扫描仪(System.in);
扫描仪inp2=新扫描仪(System.in);
T=inp.nextInt();
for(int i=0;il.length())
系统输出打印LN(u);
其他的
系统输出打印LN(l);
}
}
}
它应该给出一个全大写的
字符串
或全小写的
字符串
,这取决于哪个更大或全大写的
字符串
,如果两者长度相等,但它会给出运行时错误
java.lang.StringIndexOutOfBoundsException

即使
字符串
不是空的,并且
charAt()
函数位于索引
0
。提前感谢。

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

要解决此问题,可以将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);
}
StringBuilder u=new StringBuilder();//注意这里对StringBuilder的更改
StringBuilder l=新的StringBuilder();
字符串s=inp2.nextLine();
对于(int j=0;j
即使您的s值是
”(空白)
它仍然在while循环中,因为它在完成所有字符后不为null,所以使用length
while(s.length()>0)
应该可以工作

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.Scanner;

public class Test {

    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.length() > 0){
                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);
        }
    }
}
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileWriter;
导入java.util.Scanner;
公开课考试{
公共静态void main(字符串[]args){
int T;
扫描仪inp=新扫描仪(System.in);
扫描仪inp2=新扫描仪(System.in);
T=inp.nextInt();
对于(int i=0;i 0){
char ch=s.charAt(0);
if(字符isLowerCase(ch))
l+=ch;
否则u+=ch;
s=s.子串(1);}
如果(u.length()>l.length())
系统输出打印LN(u);
else系统输出println(l);
}
}
}

第一步是更改while,如
while(s!=null&&!s.isEmpty())
并查看是否出现错误。如果
字符(0)
超出范围,则
字符串肯定为空。这是肯定的,因为
字符串
不是
null
。从这个假设出发,而不是从JDK不知何故被破坏的假设出发。使用调试器或纸笔逐步检查代码;如果在第二次迭代中,
s
的长度正好为
1
,会发生什么情况?由
子字符串(1)
返回的
字符串的长度是多少?它确实解决了这个问题,非常感谢,但是你能解释为什么它会发生,即使字符串从来都不是空的吗?@lei正如我在评论中所说,
字符串
当然是空的。@lei“empty”与“null”不同:
System.out.println(“”.isEmpty())打印为真<代码>System.out.println(“==null)打印错误。