首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串索引越界异常:字符串索引越界: 38

字符串索引越界异常:字符串索引越界: 38
EN

Stack Overflow用户
提问于 2015-12-01 09:24:15
回答 1查看 1K关注 0票数 0

因此,正如标题所述,我在使用hadoop时收到了"String Index Out Out Bound Exception“。下面是我的地图作业:

代码语言:javascript
复制
public class UniversityMap extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {


 private Text word= new Text();

 public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException
 {
 
 String line = value.toString();
 
 String depart= line.substring(34,38);
 String people= line.substring(44,46);
 
 int p = Integer.parseInt(people);
 IntWritable p1 = new IntWritable(p);
 
    word.set( depart );
   output.collect(word, p1 );
 }
  public static void main(String[] args) {


  }

}

我收到的完整错误是:

代码语言:javascript
复制
hadoop University /root/Documents/test.txt ./output339
15/11/30 17:02:51 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
15/11/30 17:02:51 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
15/11/30 17:02:51 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
15/11/30 17:02:51 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
15/11/30 17:02:51 WARN mapreduce.JobResourceUploader: No job jar file set.  User classes may not be found. See Job or Job#setJar(String).
15/11/30 17:02:51 INFO mapred.FileInputFormat: Total input paths to process : 1
15/11/30 17:02:51 INFO mapreduce.JobSubmitter: number of splits:1
15/11/30 17:02:51 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local773905140_0001
15/11/30 17:02:51 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
15/11/30 17:02:51 INFO mapreduce.Job: Running job: job_local773905140_0001
15/11/30 17:02:51 INFO mapred.LocalJobRunner: OutputCommitter set in config null
15/11/30 17:02:51 INFO mapred.LocalJobRunner: OutputCommitter is org.apache.hadoop.mapred.FileOutputCommitter
15/11/30 17:02:51 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
15/11/30 17:02:51 INFO mapred.LocalJobRunner: Waiting for map tasks
15/11/30 17:02:51 INFO mapred.LocalJobRunner: Starting task: attempt_local773905140_0001_m_000000_0
15/11/30 17:02:51 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1
15/11/30 17:02:51 INFO mapred.Task:  Using ResourceCalculatorProcessTree : [ ]
15/11/30 17:02:51 INFO mapred.MapTask: Processing split: file:/root/Documents/test.txt:0+12
15/11/30 17:02:51 INFO mapred.MapTask: numReduceTasks: 1
15/11/30 17:02:52 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
15/11/30 17:02:52 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
15/11/30 17:02:52 INFO mapred.MapTask: soft limit at 83886080
15/11/30 17:02:52 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
15/11/30 17:02:52 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
15/11/30 17:02:52 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
15/11/30 17:02:52 INFO mapred.LocalJobRunner: map task executor complete.
15/11/30 17:02:52 WARN mapred.LocalJobRunner: job_local773905140_0001
java.lang.Exception: java.lang.StringIndexOutOfBoundsException: String index out of range: 38
        at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
        at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 38
        at java.lang.String.substring(String.java:1963)
        at UniversityMap.map(UniversityMap.java:18)
        at UniversityMap.map(UniversityMap.java:8)
        at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
        at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
        at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
15/11/30 17:02:52 INFO mapreduce.Job: Job job_local773905140_0001 running in uber mode : false
15/11/30 17:02:52 INFO mapreduce.Job:  map 0% reduce 0%
15/11/30 17:02:52 INFO mapreduce.Job: Job job_local773905140_0001 failed with state FAILED due to: NA
15/11/30 17:02:52 INFO mapreduce.Job: Counters: 0
Exception in thread "main" java.io.IOException: Job failed!
        at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:865)
        at University.main(University.java:32)

我相信我得到这个异常是因为有4个字符长或2个字符长的分割值。当它看到一个不是来自(34,38)的偏离值时,异常就会被抛出,这对吗?

EN

回答 1

Stack Overflow用户

发布于 2015-12-01 10:10:30

“字符串索引超出范围”:你得到的长度超过了你的行的长度。

根据我从您的代码中所理解的,在这两行中:

代码语言:javascript
复制
String depart= line.substring(34,38);
String people= line.substring(44,46);

这意味着行的长度必须为46个字符或更多。是那么回事吗?!所以,我认为你可以像这样检查:如果(line.length> 46) { //实现你的业务。}

如果该行无效,则跳过它。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34011052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档