制作一个循环,在碰到冒号之前返回字符

时间:2018-09-06 10:14:27

标签: java for-loop

每当我运行代码时,它都会返回以下错误消息:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
    at java.lang.String.charAt(Unknown Source)
    at codes.Main.main(Main.java:10)

这是我的代码:

    package codes;

public class Main {
    public static void main(String[] args) {
        String cord1 = "Name: x=23 y=60 z= 600";
        String cord2 = "Name: x=200 y=20 z= 300";
        int c1 = cord1.length();
        String mychar = String.valueOf("cord1".charAt(0));
        for (int a = 0; a < c1; a++){
            mychar = String.valueOf("cord1".charAt(a));
            if (mychar == ":"){
                break;
            }else{
                cord1.substring(a);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您的代码中有很多错误。.

  1. mychar == ":"应该改为mychar.equals(":")。由于字符串是不可变的,因此我们需要使用.equals而不是==来比较它们(<-用于检查引用是否相等而不是字符串值)。
  2. "cord1".charAt应该是您的变量cord1.charAt。通过使用"cord1",您基本上可以创建一个值为cord1的新字符串。
  3. cord1.substring(a);不会更改cord1的值,而是返回一个新的String。因此,您必须保存或打印此String结果,然后使用break停止循环。
  4. 使用cord1 = cord1.substring(a)会缩短字符串本身。由于您仍然在[0, c1)是原始String的范围c1中循环,因此我们仍然会收到StringIndexOutOfBoundsException。相反,您不需要else-case,并且在if-case内同时需要cord1 = cord1.substring(a)break。 (此外,我假设您也要删除:本身,因此必须使用.substring(a+1)。)
  5. 为什么还要使用String.valueOf( char )而不是自己使用char?并不是真正的要求,但是String.valueOf在这里有点多余,并且使代码的可读性降低。

将它们放在一起:

public class Main {
    public static void main(String[] args) {
        String cord1 = "Name: x=23 y=60 z= 600";
        System.out.println("cord1 before:\t" + cord1);
        int c1 = cord1.length();
        char mychar = cord1.charAt(0);
        for (int a = 0; a < c1; a++){
            mychar = cord1.charAt(a);
            if (mychar == ':'){
                cord1 = cord1.substring(a+1);
                break;
            }
        }
        System.out.println("cord1 after:\t" + cord1);
    }
}

这将导致cord1的末尾值为" x=23 y=60 z= 600"(请注意前导空格)。

Try it online.


这是一个更简单的替代方法,其结果相同:

String cord1 = "Name: x=23 y=60 z= 600";
String cord1ExcludingName = cord1.replaceFirst("^.*:","");

Try it online.

^       : Only look at the start of the String for:
 .*     : Zero or more of any character,
   :    : followed by a `:`

其中将替换为""(空字符串),因此基本上将其删除。

答案 1 :(得分:0)

使用等于代替“ ==” 像这样

 if (mychar.equals(":")){
            break;

由于要使用字符串,因此需要使用equals方法。每当您使用字符串u时,都必须将它们与equals方法进行比较。 如果您使用

  

char myChar = .....

您的代码将起作用。您可以将字符与“ ==“

进行比较

答案 2 :(得分:0)

B表示您正在查找具有最高索引4的字符串“ cord1”的第0个字符,这就是为什么它会在5处发出超出范围的异常的原因。

您要做的是String.valueOf("cord1".charAt(0))。这将考虑变量String.valueof(cord1.charAt(0))中的字符串。