我正在尝试学习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
),我们是否总是需要创建另一个类?
我搜索了我的问题,但我没有找到一个我能理解的答案,可能是因为我是新人,或者因为英语不是我的母语,我需要尽可能简单的解释。
答案 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,所以当它被抛出时,调用者代码可以知道出了什么问题。