异常抛出或捕获并尝试

时间:2017-12-08 13:01:09

标签: java exception try-catch throw

我正在尝试学习java,我在理解异常如何工作方面遇到了一些问题。

我们什么时候需要在一个条件后使用扔? 作为一个例子

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),我们是否总是需要创建另一个类?

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

2 个答案:

答案 0 :(得分:1)

  

过去的例子和这个例子之间的差异是什么!

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

第二个打印到stderr,然后创建实例。

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

new exexception().printStackTrace();

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

  

printstackTrace到底做了什么

您的第一站应为Javadoc

  

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

记录的数据

继续。阅读它,并询问有关您不理解的具体问题。

  

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

您并不总是需要新的异常类型。 Effective Java 2nd Ed 项目60建议“赞成使用标准例外”。

请注意,您基本上从不想要抛出Exception本身(并且很少应该抓住它)。

答案 1 :(得分:0)

第一个代码段将在分配age,name和prenom之前中断程序流,将控件返回给调用者方法,该方法需要捕获异常。

第二个片段不会中断程序的流程。它将打印堆栈跟踪(这只是你的例外)然后打印年龄,名称和prenom。

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

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

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