Java如何实现仅在Main类中调用System.exit(0)统一处理程序退出
统一System.exit调用位置改造方案
核心思路
被调用类只负责自身职责范围内的逻辑(文件读取、数据解析、错误提示输出),不直接终止JVM;所有程序终止的决策全部放在Main类中执行,通过Java原生的异常传递机制,把被调用类中发生的错误信号传递到上层。
具体改造步骤
1. 修改InlezenBestandMetDatums类
- 给
inlezenTabel()方法添加异常声明,允许向上抛出日期解析异常 - 删除DateTimeException捕获块中的
System.exit(0)调用,完成错误提示输出后,将捕获到的异常重新抛出给上层调用者 - 原有的IOException处理逻辑保持不变(输出错误提示后返回空列表)
改造后的核心代码片段:
// 方法签名添加异常抛出声明 public static ArrayList<BeschikkingenSelectieDatums> inlezenTabel() throws DateTimeException { ArrayList<BeschikkingenSelectieDatums> resultaatIngelezenBestand = new ArrayList<BeschikkingenSelectieDatums>(); String regelInBestandMetDatums = ""; DateTimeFormatter datumTijdFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); try(Scanner scanner = new Scanner(new File(BESTAND_MET_DATUMS))) { while(scanner.hasNext()) { regelInBestandMetDatums = scanner.next(); BeschikkingenSelectieDatums datumsIngelezenNaSplit = new BeschikkingenSelectieDatums( LocalDate.parse(regelInBestandMetDatums.split(SCHEIDINGSTEKEN_IN_BESTAND)[0], datumTijdFormatter), LocalDate.parse(regelInBestandMetDatums.split(SCHEIDINGSTEKEN_IN_BESTAND)[1], datumTijdFormatter)); resultaatIngelezenBestand.add(datumsIngelezenNaSplit); } } //Valideren datum catch(DateTimeException ex) { OutputNaarGebruikerAfhandeling.FoutmeldingTonenIndienFouteDatumInCSVBestandAanwezig("Beschikkingenselectie datums",regelInBestandMetDatums.split(SCHEIDINGSTEKEN_IN_BESTAND)[0] ); OutputNaarGebruikerAfhandeling.FoutmeldingTonenIndienFouteDatumInCSVBestandAanwezig("Beschikkingenselectie datums",regelInBestandMetDatums.split(SCHEIDINGSTEKEN_IN_BESTAND)[1] ); // 移除内部退出逻辑,向上抛异常传递错误信号 throw ex; } //Valideren aanwezigheid bestand catch(IOException e) { OutputNaarGebruikerAfhandeling.FoutmeldingTonenIndienCSVBestandNietAanwezig(e.getMessage(), "Beschikkingenselectie datums"); } return resultaatIngelezenBestand; }
2. 修改Main类的调用逻辑
在调用inlezenTabel()方法时添加异常捕获,捕获到日期解析异常时在Main类中执行退出;原有的空列表判断退出逻辑保持不变。
改造后的调用代码:
ArrayList<BeschikkingenSelectieDatums> ingelezenDatums = new ArrayList<>(); try { ingelezenDatums = InlezenBestandMetDatums.inlezenTabel(); } catch (DateTimeException e) { // 日期解析错误的提示已经在被调用类中完成,这里统一执行退出 System.exit(0); } if (ingelezenDatums.isEmpty()) { System.exit(0); }
方案说明
- 所有
System.exit(0)调用现在全部集中在Main类中,完全符合预期的退出逻辑管控要求 - 改动量极小,原有业务逻辑(错误提示、文件不存在的处理流程)完全保留,不需要重构其他代码
- 采用Java原生异常机制传递错误信号,不需要额外引入自定义返回结构,适配Java基础阶段的代码实现要求
内容的提问来源于stack exchange,提问作者Marcel Eggen
相关产品推荐
相关产品推荐

