【问题标题】:What's the point of throwing an Exception from the main method of Java program?从 Java 程序的 main 方法中抛出异常有什么意义?
【发布时间】:2014-08-04 08:30:13
【问题描述】:

从Java程序的main方法中抛出异常有什么意义, 因为它永远无法被任何调用方法捕获和处理?

以下内容真的没有意义吗?

public static void main(String[] args) throws ReconToolException {

    parseCmdArgs(args); 

    try {
        CSVSingleton.tryToReadBothFiles(FILE1_PATH, FILE2_PATH);
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(0);
    }

    run();

}

最好是:

public static void main(String[] args) {

        parseCmdArgs(args); 

        try {
            CSVSingleton.tryToReadBothFiles(FILE1_PATH, FILE2_PATH);
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }

        try {
            run();
        } catch (ReconToolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

Java 应该阻止我们做前者吗?或者也许在更复杂的框架中,主方法有能力将异常进一步抛出链?

【问题讨论】:

  • main() 抛出异常将打印堆栈跟踪,无需任何额外代码。这意味着两个示例的行为是相同的。第一个是打字少很多。
  • 是什么让你认为它没有被抓到? jre 本身会捕获它。而且它是一个公共方法,任何其他代码都可以包装它并调用它并捕获它。
  • 不......你不能在 main 方法周围包装代码!

标签: java exception main


【解决方案1】:

不仅可以捕获抛出的异常,还可以捕获来自 tryToReadBothFiles 的异常。

如果你问为什么 main 方法上有一个 'throws' 关键字,我会假设 parseCmdArgs 可以抛出 ReconToolException,并且这个 main 的作者要么知道它永远不会被抛出,要么不想处理它。为了使程序编译,他必须做以下两件事之一:为异常添加一个“catch”,或者为 main 添加一个“throw”。如果程序无论如何都要终止,那么他做什么都没有关系。添加“投掷”的工作量更少。

【讨论】:

  • 你说它被抓住了,但它没有被前者抓住。对吗?
  • tryToReadBothFiles 的异常被捕获。 parseCmdArgs 的异常不是。因为我不知道你在说哪个,所以我都介绍了。
  • 对,所以我想你可能没有认识到我的问题,即从 Java 程序的入口点 main 方法抛出异常的意义何在,因为没有什么可抓住它。它应该被禁止。
  • 在第二段。
  • you never know for sure 其实你可以肯定知道。如果文档说明什么时候会抛出异常,并且您在调用它之前进行检查,那么只有在方法被错误时才会抛出异常。在这种情况下,您无论如何都没有能力处理错误。在某些程序中,您只想在某些异常上崩溃。既然可以让 JVM 为你处理,为什么还要自己处理呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
相关资源
最近更新 更多