为了账号安全,请及时绑定邮箱和手机立即绑定

Java 程序中的异常处理

Java 程序中的异常处理

紫衣仙女 2022-06-15 17:36:23
这是我的程序结构:主函数 -> 调用 A 类 obj -> A 类调用 B 类 obj在异常处理方面,如果在 main、A 类或 B 类中遇到异常,我想以错误代码退出程序。目前,我正在做我认为是一个繁琐的过程(并且可能是一种愚蠢的方式):-> 在 A 类和 B 类的函数中进行异常处理。-> 如果函数中发生异常,让函数退出并返回一个被视为“错误”的值(例如特定值或布尔值 false)。-> main 有自己的 try/catch,但对于 A 类和 B 类的每个函数调用,如果返回是 'error',它会抛出异常,然后以错误代码退出。我对这种方法的争论是(a)我可能多次抛出和处理异常(在类级别,然后在主级别)。(b) 如果假设类中的函数返回一个值,那么我必须留出一个特定值,当接收到该值时,应该将其解释为错误。任何更清洁的建议?这适用于将被编译为从命令行作为可执行 JAR 运行的程序,并且不会是微服务(或基于 Web 服务器 - 对于那些,我认为,而不是退出程序,您会在日志中报告错误并继续)。
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您应该遵循的基本思想是拥有这样的main方法:


public static void main(String... args) {

    try {

        new A().run();

    } catch (ExitProgramException e) {

        System.exit(e.getCode());

    }

}

目前还没有预定义ExitProgramException。这很好,因为否则其他一些类可能已经抛出它。但是,在这种情况下,您希望定义可以引发此异常的所有位置。异常类应定义如下:


public final class ExitProgramException extends RuntimeException {


    private final int code;


    public ExitProgramException(int code) { this.code = code; }


    public int getCode() { return code; }

}

现在,在 A 类和 B 类中,您可以throw new ExitProgramException(1),并且一切都会按预期工作。


由于extends RuntimeException,中间代码不必知道这个异常,并且会很高兴地让它冒泡,从类 B 到类 A 回到main方法,最终被捕获并转换为退出代码。


查看完整回答
反对 回复 2022-06-15
?
跃然一笑

TA贡献1826条经验 获得超6个赞

一般来说,只有在以下情况下才值得捕获并重新抛出异常:

  • 您将抛出不同类型的异常(更适合方法提供的抽象,通常包装原始异常),和/或

  • 你想要一些副作用(例如在某处记录错误,或者一些不适合finally { }块的清理)。

如果你没有做任何这些,那么就选择简单的方法,不要捕获异常。但是请务必在方法的 JavaDoc 中提及它,即使它没有被选中。

正如其他人所说,返回专门的错误代码在 Java 中很少是一个好主意。它们罗嗦,容易忘记,并且不会传播给调用者。并且返回一个特殊值(例如null)来代替正常的返回值更糟糕!例外是标准的方式,这是每个人都会期待的。


查看完整回答
反对 回复 2022-06-15
?
MYYA

TA贡献1868条经验 获得超4个赞

Java 中的异常之处在于,它们在语义上做了很多不同的事情

  1. 代码错误:如 NullPointerException 或 SQLExceptions 等异常,您的 SQL 不正确。这些(IMO)不应该被捕获,或者应该作为错误重新抛出并在 uncaughtExceptionHandler (您可以在 Thread 中定义)中捕获

  2. 用户错误:NumberFormatException 等异常和错误表单数据异常,其中用户输入了无效值。这个(IMO)应该在他们应该更正值的地方附近有一条消息来处理

  3. 正常的、预期的异常:IOException / SocketException 等异常。InterruptedException 也在这个家族中。这些例外是你的朋友(!),因为他们解锁了正在等待他们应该等待的东西的线程。它们是连接到 IO 资源的正常周期的一部分。因此,如果套接字关闭,您可以在某处记录异常(有时甚至没有必要),并可能询问用户是否要重新打开连接。


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 177 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号