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,所以使用lengthwhile(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)代码>打印错误。