try {
string = scan.nextLine().charAt(0);
} catch(StringIndexOutOfBoundsException siobe){
System.out.println("invalid input");
}
我正在尝试使用此代码来处理我从文本文件中获取的字符串的异常。但我得到一个错误,说尝试将实际的字符串声明更改为字符。我不知道该如何处理?
答案 0 :(得分:5)
但我得到一个错误,说尝试将实际的字符串声明更改为字符。
scan.nextLine().charAt(0)
是char
因此,如果string
是String
(正如您所获得的编译错误所暗示的那样),则您无法指定一个字符它
如果您只需要输入行的第一个字符,则应将其存储在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()读取的字符串。
希望这有帮助。