stringindexoutofboundsexception

fcipmucu  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(286)

我试图打破记录成字的非字母数字字符的基础上,计数每个字的第一个字母,并得到每个字的第一个字母出现的总数。下面是我试图执行的Map器类逻辑。

  1. public void map(LongWritable key, Text value, Context ctx) {
  2. String line = value.toString();
  3. String[] split = line.split("\\W+");
  4. String firstChar;
  5. for(String words: split) {
  6. firstChar = String.valueOf(words.charAt(0));
  7. try {
  8. ctx.write(new Text(firstChar), new IntWritable(1));
  9. } catch (IOException | InterruptedException e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. }

例外情况:

  1. Error: java.lang.StringIndexOutOfBoundsException: String index out of range: 0
  2. at java.lang.String.charAt(String.java:658)
  3. at com.hadoopexp.mapper.MapperClass.map(MapperClass.java:17)
  4. at com.hadoopexp.mapper.MapperClass.map(MapperClass.java:1)

但是我得到了stringindexoutofbounds异常,该逻辑在第行:

  1. firstChar = String.valueOf(words.charAt(0));

我在输入文件中放了一些空行,看看是否有效((如下所示)

  1. Liverpool
  2. Manchester
  3. London
  4. Toronto ? ?? !!12 32

有谁能帮我修正逻辑吗。非常感谢您的帮助。

oknwwptz

oknwwptz1#

拆分空字符串将返回一个数组,其中包含空字符串的单个元素。我只是明确地检查一下:

  1. for(String words: split) {
  2. if (!words.isEmpty()) { // Here!
  3. firstChar = String.valueOf(words.charAt(0));
  4. try {
  5. ctx.write(new Text(firstChar), new IntWritable(1));
  6. } catch (IOException | InterruptedException e) {
  7. e.printStackTrace();
  8. }
  9. }
  10. }

相关问题