Java中Void方法return失效及数组越界问题求助
Java日期验证方法的return提示与数组越界问题解决
问题描述
我用Java编写了一个日期验证方法validar,希望满足特定条件时直接退出方法。最初的条件判断中return可以正常生效,但在条件判断后添加拆分日期的数组逻辑后,后续条件里的return会提示“'return' is unnecessary as the last statement in a 'void' method”;如果把数组创建放到条件判断前,又会触发ArrayIndexOutOfBoundsException。求解决这两个问题的方案。
原有效代码示例
public static void validar(String data) { System.out.println(data); if (data.indexOf(" ") == -1) { System.out.println("No hi ha separació entre data i temps"); System.out.println("Data incorrecta" + "\n"); return; } else if (data.indexOf("-") == -1) { System.out.println("La data no conté un guions"); System.out.println("Data incorrecta" + "\n"); return; } else if (data.indexOf(":") == -1) { System.out.println("El temps de la data no conté :'s"); System.out.println("Data incorrecta" + "\n"); return; } // 后续逻辑... }
添加数组后的问题代码示例
public static void validar(String data) { System.out.println(data); if (data.indexOf(" ") == -1) { System.out.println("No hi ha separació entre data i temps"); System.out.println("Data incorrecta" + "\n"); return; } else if (data.indexOf("-") == -1) { System.out.println("La data no conté un guions"); System.out.println("Data incorrecta" + "\n"); return; } else if (data.indexOf(":") == -1) { System.out.println("El temps de la data no conté :'s"); System.out.println("Data incorrecta" + "\n"); return; } String[] arrDiaHora = data.split(" "); String diamesany = arrDiaHora[0]; String horaminutsegon = arrDiaHora[1]; String[] arrDiaMesAny = diamesany.split("-"); String strany = arrDiaMesAny[0]; String strmes = arrDiaMesAny[1]; String strdia = arrDiaMesAny[2]; String[] arrHoraMinutSegon = horaminutsegon.split(":"); String strhora = arrHoraMinutSegon[0]; String strminut = arrHoraMinutSegon[1]; String strsegon = arrHoraMinutSegon[2]; if (arrDiaHora.length != 2) { System.out.println("No hi ha dos blocs formats per data i temps"); System.out.println("Data incorrecta" + "\n"); return; } // 后续逻辑... }
解决思路与修正代码
核心问题分析
- 数组越界:先提取数组元素再校验长度,万一拆分后的数组长度不足,直接取元素就会触发
ArrayIndexOutOfBoundsException - return提示:如果
return是void方法的最后一行代码,编译器会提示冗余,因为void方法执行到末尾会自动返回
修正方案
调整代码顺序,先拆分数组,再校验长度,最后提取元素;同时确保return只出现在中间的校验分支,而非方法最后一行。
修正后的代码:
public static void validar(String data) { System.out.println(data); // 先校验必备分隔符是否存在 if (data.indexOf(" ") == -1) { System.out.println("没有日期和时间的分隔符"); System.out.println("日期格式错误\n"); return; } if (data.indexOf("-") == -1) { System.out.println("日期中不含连字符"); System.out.println("日期格式错误\n"); return; } if (data.indexOf(":") == -1) { System.out.println("时间部分不含冒号"); System.out.println("日期格式错误\n"); return; } // 拆分日期时间块,先校验长度再提取元素 String[] arrDiaHora = data.split(" "); if (arrDiaHora.length != 2) { System.out.println("没有拆分成日期和时间两个部分"); System.out.println("日期格式错误\n"); return; } String diamesany = arrDiaHora[0]; String horaminutsegon = arrDiaHora[1]; // 拆分日期部分,校验长度后提取 String[] arrDiaMesAny = diamesany.split("-"); if (arrDiaMesAny.length != 3) { System.out.println("日期部分格式不正确(需为日-月-年格式)"); System.out.println("日期格式错误\n"); return; } String strany = arrDiaMesAny[0]; String strmes = arrDiaMesAny[1]; String strdia = arrDiaMesAny[2]; // 拆分时间部分,校验长度后提取 String[] arrHoraMinutSegon = horaminutsegon.split(":"); if (arrHoraMinutSegon.length != 3) { System.out.println("时间部分格式不正确(需为时:分:秒格式)"); System.out.println("日期格式错误\n"); return; } String strhora = arrHoraMinutSegon[0]; String strminut = arrHoraMinutSegon[1]; String strsegon = arrHoraMinutSegon[2]; // 后续其他校验逻辑... }
方案说明
- 避免数组越界:每次拆分后先校验数组长度,只有长度符合要求时才提取元素,从根源上避免了索引越界问题
- 解决return提示:调整后所有
return都处于中间校验分支,不会出现在方法最后一行;如果后续没有其他代码,直接删除最后一个return即可,void方法会自动返回
内容的提问来源于stack exchange,提问作者DBG
相关产品推荐
相关产品推荐

