我试图将记录分解为基于非字母数字字符的单词,计算每个单词的第一个字母,并获得每个单词中第一个字母的总和。以下是我尝试执行的Mapper类逻辑。
public void map(LongWritable key, Text value, Context ctx) {
String line = value.toString();
String[] split = line.split("\\W+");
String firstChar;
for(String words: split) {
firstChar = String.valueOf(words.charAt(0));
try {
ctx.write(new Text(firstChar), new IntWritable(1));
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
异常(exception):
Error: java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:658)
at com.hadoopexp.mapper.MapperClass.map(MapperClass.java:17)
at com.hadoopexp.mapper.MapperClass.map(MapperClass.java:1)
但我在此行得到此逻辑的StringIndexOutOfBounds异常:
firstChar = String.valueOf(words.charAt(0));
我在输入文件中放了一些空白行,以查看其是否有效。 (如下所示)
Liverpool
Manchester
London
Toronto ? ?? !!12 32
谁能帮助我解决逻辑问题。任何帮助都非常感谢。
最佳答案
拆分空字符串将返回一个包含空字符串中单个元素的数组。我会明确检查一下:
for(String words: split) {
if (!words.isEmpty()) { // Here!
firstChar = String.valueOf(words.charAt(0));
try {
ctx.write(new Text(firstChar), new IntWritable(1));
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
关于java - 我的MapReduce代码中的StringIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42188428/