1

我正在使用str.split("!")当字符串中包含感叹号时,通过设置代码的方式,如果没有感叹号,我将获得一个 1 索引数组,如果有,我将获得一个 2 索引数组。

代码:

String file, macroName;

String[] fileAndMacro = string.split("!");
if(fileAndMacro[0] != null)
    file = new File(fileAndMacro[0]);
if(fileAndMacro[1] != null)
    macroName = fileAndMacro[1];

如果我输入一个带有感叹号的字符串,它就可以工作。例如"test!string"将返回fileAndMacro[0] = "test"and fileAndMacro[1] = "string"

问题是当我没有感叹号时(你们中的一些人可能从我的代码中看出)。我只是得到一个ArrayIndexOutOfBoundsException. 因此,显然空检查并不能解决问题。如果没有为要存储的值分配空间,考虑到内存中不能有空值,这是有道理的。

尽管我对此有所了解,但我不确定如何检查第二个索引是否存在。如何实时检查索引是否存在?

4

4 回答 4

10

您需要检查数组的长度,因此:

if(fileAndMacro.length > 1)
   macroName = fileAndMacro[1];

通过访问不存在的索引,您将访问内存中不属于您创建的数组(实际上是在split()方法中创建)的其他一些空间,这就是您得到异常的原因。

于 2013-06-13T18:31:46.210 回答
0

只是测试fileAndMacro.length。如果是 2 或更大,则至少有一个感叹号。

于 2013-06-13T18:31:52.363 回答
0

您可以使用其长度属性检查数组的长度 array.length

if (array.length  < 2){
    //perform some operation you want

}
于 2013-06-13T18:34:40.097 回答
-1

这个问题也适用于 Kotlin。所以,这里是 Kotlin 的解决方案:

if (index in myArray.indices) {
  // index is valid
}

其他解决方案:

myArray.getOrNull(index)?.let { element ->
  // index is valid; use the element
}
if (myList.getOrNull(index) != null) {
  // index is valid
}
if (index in 0..myArray.lastIndex) {
  // index is valid
}
if (index >= 0 && index <= myArray.lastIndex) {
  // index is valid
}

集合还有另一个类似的问题

于 2021-09-27T09:14:07.027 回答