【问题标题】:exceptions throw or catch and try异常抛出或捕获并尝试
【发布时间】:2017-12-08 13:01:09
【问题描述】:

我正在尝试学习 java,但在理解异常的工作原理方面存在一些问题。

我们什么时候需要在条件后使用 throw? 举个例子

public Ex(String name, String prenom, int age) throws exceptionex  {
    if (name.length() < 3 && prenom.length() < 3 && age < 1) throw new exceptionex();

        this.age = age;
        this.name = name;
        this.prenom = prenom;

}

excepetionex 是一个空类,它扩展了Exception

上一个例子和这个例子有什么区别?

public Ex(String name, String prenom, int age)   {
    if (name.length() < 3 && prenom.length() < 3 && age < 1)
        try {
            throw new exceptionex();
        } catch (exceptionex e) {
            e.printStackTrace();
        }

        this.age = age;
        this.name = name;
        this.prenom = prenom;

}

printstackTrace 到底是做什么的?

如果我们想自定义异常(exeptionex 这里)或者我们可以只使用(throw new Exception),我们是否总是需要创建另一个类?

我用谷歌搜索了我的问题,但没有找到我能理解的答案,可能是因为我是新手,或者因为英语不是我的母语,我需要尽可能简单的解释。

【问题讨论】:

  • 你不需要抛出异常来打印它的堆栈跟踪:new exceptionex().printStackTrace() 做的差不多。
  • “有什么区别”第一个阻止您创建Ex 的无效实例;第二个打印一些东西到stderr,然后无论如何创建对象。
  • 首先请记住java类名及其构造函数要大写。
  • "printstackTrace 到底是做什么的?" 学习阅读docs,这是您的大部分答案所在。
  • 如果 if 条件为真,基本上第一个只是抛出一个异常,“取消”构造函数。第二个做同样的事情,但随后捕获异常,将堆栈跟踪打印到 stderr 并继续构造函数。

标签: java exception try-catch throw


【解决方案1】:

上一个例子和这个例子有什么区别!

如果满足该条件,第一个会阻止您创建 Ex 的实例。

第二个打印一些东西到stderr,然后无论如何创建实例。

请注意,您不需要抛出异常来打印其堆栈跟踪:

new exexception().printStackTrace();

与第二个示例中的 try/catch 相同。

printstackTrace 到底是做什么的

您的第一站应该是Javadoc:

将此 throwable 及其回溯打印到标准错误流。此方法在错误输出流上打印此 Throwable 对象的堆栈跟踪,即字段 System.err 的值。输出的第一行包含此对象的toString() 方法的结果。剩下的行代表之前通过fillInStackTrace()方法记录的数据...

继续。阅读它,并针对您不理解的内容提出具体问题。

如果我们想自定义异常(这里是 exeptionex),我们是否总是需要创建另一个类,或者我们可以使用(抛出新异常)!

您并不总是需要新的异常类型。 Effective Java 2nd Ed 第 60 条建议“支持使用标准异常”。

请注意,您基本上从不想自己抛出Exception(而您很少应该抓住它)。

【讨论】:

    【解决方案2】:

    第一个sn-p会在分配age、name和prenom之前中断程序的流程,将控制权返回给需要捕获异常的调用者方法。

    第二个sn-p不会打断程序的流程。它将打印堆栈跟踪(这将只是您的例外),然后分配年龄、姓名和前缀。

    printStackTrace 仅在发生异常时在标准输出上输出调用堆栈,因此您可以查看方法调用的完整层次结构以对异常原因进行分类。

    抛出异常的常见做法是使用 Exception 或 Throwable 的子类,它们提供有关正在发生的错误类型的语义信息。例如,您可能已经见过 NullPointerException。

    在您提供的示例中,我猜您可以将您的异常重命名为 IvalidPersonalDetailsException 之类的名称,因此当它被抛出时,调用者代码可以知道出了什么问题。

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多