在java中查找字符串的所有大写字母

Eva*_*anD 5 java printing string lang uppercase

所以我试图找到用户输入的字符串中的所有大写字母但我不断收到此运行时错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: 4
at java.lang.String.charAt(String.java:686)
at P43.main(P43.java:13)
Run Code Online (Sandbox Code Playgroud)

我觉得很愚蠢,但我无法弄清楚这一点,oracle甚至在页面上谈到关于java.lang.StringIndexOutOfBoundsException的 charAt

这是我的代码,用于查找大写字母并打印它们:

import java.io.*;
import java.util.*;

public class P43{
   public static void main(String[] args){
      Scanner in = new Scanner(System.in);
      //Uppercase
      String isUp = "";
      System.out.print("Please give a string: ");
      String x = in.next();
      int z = x.length();
      for(int y = 0; y <= z; y++){
         if(Character.isUpperCase(x.charAt(y))){
            char w = x.charAt(y);
            isUp = isUp + w + " ";
         }
      }
      System.out.println("The uppercase characters are " + isUp);
      //Uppercase
   }
}
Run Code Online (Sandbox Code Playgroud)

我真的很感激任何输入和/或帮助.

kos*_*osa 16

for(int y = 0; y <= z; y++){
Run Code Online (Sandbox Code Playgroud)

应该

for(int y = 0; y < z; y++){
Run Code Online (Sandbox Code Playgroud)

记住数组索引从ZERO开始.

字符串长度返回

字符串中的16位Unicode字符数

因为循环从ZERO开始,循环应终止于长度-1.


azz*_*azz 8

超出边界的数组索引是由于for循环没有终止length - 1,它终止于length 大多数迭代for循环应该是以下形式:

for (int i = 0; i < array.length; i++) {
    // access array[i];
}
Run Code Online (Sandbox Code Playgroud)

它与字符串相同.

也许更清洁的方式是:

String inputString; // get user input

String outputString = "";

for (int i = 0; i < inputString.length; i++) {
    c = inputString.charAt(i);
    outputString += Character.isUpperCase(c) ? c + " " : ""; 
}
System.out.println(outputString);
Run Code Online (Sandbox Code Playgroud)

编辑:忘了String没有实现Iterable<Character>,愚蠢的Java.


ltl*_*Boy 5

使用Java 8,您还可以使用lambdas.转换String为a IntStream,使用过滤器仅获取大写字符,并String通过将过滤后的字符附加到以下内容来创建新的字符StringBuilder:

Scanner in = new Scanner(System.in);
System.out.print("Please give a string: ");
//Uppercase
String isUp = in.next()
        .chars()
        .filter((c) -> Character.isUpperCase(c))
        .collect(StringBuilder::new, // supplier
                StringBuilder::appendCodePoint, // accumulator
                StringBuilder::append) // combiner
        .toString();
System.out.println("The uppercase characters are " + isUp);
//Uppercase
Run Code Online (Sandbox Code Playgroud)

灵感来自: