You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:24:26