处理String的StringIndexOutOfBoundsException

时间:2015-06-16 05:54:47

标签: java

try {
    string = scan.nextLine().charAt(0);
} catch(StringIndexOutOfBoundsException siobe){
    System.out.println("invalid input");
}

我正在尝试使用此代码来处理我从文本文件中获取的字符串的异常。但我得到一个错误,说尝试将实际的字符串声明更改为字符。我不知道该如何处理?

3 个答案:

答案 0 :(得分:5)

  

但我得到一个错误,说尝试将实际的字符串声明更改为字符。

scan.nextLine().charAt(0)char因此,如果stringString(正如您所获得的编译错误所暗示的那样),则您无法指定一个字符它

如果您只需要输入行的第一个字符,则应将其存储在char变量中。

char first;
try {
    first = scan.nextLine().charAt(0);
} catch(StringIndexOutOfBoundsException siobe){
    System.out.println("invalid input");
}

当然,如果在获取第一个字符之前测试String的长度,则可以避免捕获此异常的需要:

char first;
String line = scan.nextLine();
if (line.length() > 0)
    first = line.charAt(0);
else
    System.out.println("invalid input");

答案 1 :(得分:2)

您的编译错误是因为String.charAt()返回的是char,而不是String。他们是不同的类型 - 你需要非常清楚他们之间的区别。你可以只是将变量更改为char变量,同时重命名它 - 但这是检查字符串是否为空的一种非常糟糕的方法。当你可以直接测试它时,刻意挑起这样的例外是一个坏主意 - 每当你发现自己捕捉到特定的RuntimeException时,你应该问自己是否有更好的方法来避免它。

在尝试获取第一个字符之前,您应该使用String.isEmpty()String.length()。例如:

String line = scan.nextLine();
if (line.isEmpty()) { // Or line.length() == 0
    // Whatever you want to do for invalid input.
} else {
    char firstChar = line.charAt(0);
    // Use firstChar
}

当然,如果您实际上需要第一个字符,并且您只是尝试检测空字符串,则可以使用第一部分,而不使用{{ 1}}。

答案 2 :(得分:0)

方法charAt()作为名称表示返回字符。因此,编译错误是因为您尝试将字符分配给String类型的变量(在您的情况下为字符串)。

如果你的目标是从扫描仪对象中检索下一行并检查它的第0个字符索引以查找异常,你可以执行以下操作:

String string = null;
..
char c;
string = scan.nextLine();
try {
    c = string.charAt(0);
} catch (StringIndexOutOfBoundsException siobe) {
    //Exception handling
}

这样,您可以继续使用由于调用charAt()而发生异常之前使用nextLine()读取的字符串。

希望这有帮助。