Java命令行未传参时错误提示不生效报数组越界问题排查
问题产生原因
- 数组越界的根因:参数长度校验逻辑写在了数组取值操作的后面。你在进入if/else判断前就执行了
String txtFile = args[0];、String jsonFile = args[1];两行代码,当无启动参数传入时args数组长度为0,执行到这两行时会直接抛出ArrayIndexOutOfBoundsException,后续的分支判断完全不会执行,自定义错误提示自然无法输出。 - 校验条件不符合业务要求:你当前的判断条件是
args.length > 0,但需求要求传入2个文件参数,就算把取值逻辑移到判断后,用户只传1个参数时访问args[1]依然会触发越界异常。 - 分支作用域写法错误:for循环后未添加大括号,Java中不带大括号的循环、条件语句默认仅管辖紧跟的第一行代码,你写的
loader.SaveDocumentsToJSON(args[1]);实际不在for循环的执行范围内;且循环内每次都读取args[0]属于无意义的冗余逻辑,完全没有循环的必要。 - 存在类名笔误:你定义的类名为
BTextLoader,实例化时写的是new B1TextLoader(),和类名不匹配会直接导致编译失败,需要和项目中实际定义的类名保持对齐。
修正方法
把参数取值逻辑移到参数校验通过的分支内部,将校验条件改为判断参数数量恰好为2,删除无意义的for循环,补全代码块大括号,修正类名笔误即可。修正后的核心代码如下:
import java.util.concurrent.ConcurrentHashMap; public class BTextLoader { ConcurrentHashMap<String, String> documents = new ConcurrentHashMap<>(); public static void main(String[] args) { BTextLoader loader = new BTextLoader(); // 先校验参数数量,符合要求再执行业务逻辑 if (args.length == 2) { String txtFile = args[0]; String jsonFile = args[1]; loader.LoadTextFile(txtFile); loader.SaveDocumentsToJSON(jsonFile); } else { System.err.println("参数错误:请传入2个空格分隔的文件名作为启动参数,依次为txt源文件路径、json导出路径"); } } // 保留你原有的LoadTextFile、SaveDocumentsToJSON业务方法即可 private void LoadTextFile(String txtPath) { // 原有业务逻辑 } private void SaveDocumentsToJSON(String jsonPath) { // 原有业务逻辑 } }
内容的提问来源于stack exchange,提问作者Bluetail
相关产品推荐
相关产品推荐

