小白教程

 找回密码
 立即注册
查看: 9901|回复: 6

[已解决]java下标越界如何解决

[复制链接]

1

主题

2

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2021-4-2 11:32:23 | 显示全部楼层 |阅读模式
  1. package bianma;

  2. import java.io.*;
  3. import java.util.HashMap;


  4. public class P2 {
  5.     public static void main(String[] args) throws IOException {
  6.         HashMap<String,String> map = new HashMap<>();
  7.         BufferedReader br = new BufferedReader(new FileReader("paixu.txt"));
  8.         BufferedWriter bw = new BufferedWriter(new FileWriter("paixu2.txt"));
  9.         String line;
  10.         while((line = br.readLine())!=null){         
  11. //         String[] arr =new String[3];
  12.             arr = line.split("\\.");
  13. //            System.out.println(arr[0]);
  14. //            System.out.println(arr[1]);            
  15.             map.put(arr[0],arr[1]);
  16. //            System.out.println(map);
  17.         }

  18.         for(String key : map.keySet()){
  19.             String value = map.get(key);
  20.             System.out.println(value);         
  21.             line = key + "." + value;            
  22.             bw.write(line);
  23.             bw.newLine();//写换行
  24.         }        
  25.         bw.close();
  26.         br.close();
  27.     }
  28. }
复制代码
报错Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
报错行一直显示是“map.put(arr[0],arr[1])”这一行
如果在此行之前加上“System.out.println(arr[1]);”,报错的就是这行
把“map.put(arr[0],arr[1])”注释掉程序正常运行(没有结果)
请问这是什么问题呀

最佳答案
2021-5-4 10:17:00
  arr = line.split("\\.");
  map.put(arr[0],arr[1]);

这两行,你想下,第一行是将读到的一行内容按点号拆分,第二行是使用拆分的两个数据。

那么,如果文件有空行呢,或者这行内容没有点号呢,如果遇到这样的内容,当然下标越界,因为没有 arr[1]

建议在map.put前面增加检查,如果arr的size是2才读取,其他情况跳过,或者针对性的处理下应该就可以了
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-4-4 06:21:21 | 显示全部楼层
只有一个数据 只有下标0的那个  下标1就越界了
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-4-15 10:32:25 | 显示全部楼层
System.out.prntln(arr);
arr = line.split("\\.");

前面打印一下你的数据,应该是某一行没有小数点分割的。
回复

使用道具 举报

0

主题

2

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2021-4-29 05:47:26 | 显示全部楼层
楼主,你是要求用户输入时,按你的规范来,要求输入两个数据,数据之间用一个分隔符,但是用户使用时,偏不按你的要求来,所以你 split 得不到到你想要的
这时,你要做的是,判断用户输入格式是否符合要求,如果不符合,就直接报错,不要走到下面的处理逻辑去。
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-4 10:17:00 | 显示全部楼层 &
  arr = line.split("\\.");
  map.put(arr[0],arr[1]);

这两行,你想下,第一行是将读到的一行内容按点号拆分,第二行是使用拆分的两个数据。

那么,如果文件有空行呢,或者这行内容没有点号呢,如果遇到这样的内容,当然下标越界,因为没有 arr[1]

建议在map.put前面增加检查,如果arr的size是2才读取,其他情况跳过,或者针对性的处理下应该就可以了
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-15 07:15:15 | 显示全部楼层
因为你运行的时候没有给它穿参数。args的长度是0,所以会出现下标越界
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-24 19:10:42 | 显示全部楼层
简单来说,至少有一行是没有\\.的,所以出现异常,try一下吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-11-24 12:40 , Processed in 0.057266 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表