好的......所以我正在学习java中的异常,我目前正在使用throw语句。抛出Exception类的异常,然后再次从catch块中重新抛出它以在main函数中处理它。但每当我把它作为Exception类抛出时,我总是在catch块中得到一个错误(在那里我重新抛出它以便在main中处理)。但是一旦我改变了抛出并捕获了一些特殊的异常,如NullPointerException,它有效!
错误代码:
class ThrowingExceptions {
static boolean enable3dRendering = false;
public static void main(String [] com) {
try {
renderWorld();
}
catch(Exception e) {
System.out.println("Rendering in 2d.");
}
}
static void renderWorld() {
try{
if(!enable3dRendering) {
System.out.println("3d rendering is disabled. Enable 3d mode to render.");
throw new Exception("3d mode Disabled.");
}
else {
System.out.println("The World is Empty!");
}
}
catch(Exception e) {
System.out.println("Please handle the error");
throw e; // It gives me an error here
}
}
}
工作代码:
class ThrowingExceptions {
static boolean enable3dRendering = false;
public static void main(String [] com) {
try {
renderWorld();
}
catch(NullPointerException e) {
System.out.println("Rendering in 2d.");
}
}
static void renderWorld() {
try{
if(!enable3dRendering) {
System.out.println("3d rendering is disabled. Enable 3d mode to render.");
throw new NullPointerException("3d mode Disabled.");
}
else {
System.out.println("The World is Empty!");
}
}
catch(NullPointerException e) {
System.out.println("Please handle the error");
throw e;
}
}
}
为什么它不能与Exception类一起使用并使用它的子类??
注意: - 我在错误代码中得到的错误是Unhandled exception type Exception
答案 0 :(得分:1)
运行时异常扩展RuntimeException
。它们不必处理或声明。
它们可以由程序员或JVM抛出。
已检查的异常在其层次结构中有Exception
但不是RuntimeException。他们
必须处理或声明。它们可以由程序员或JVM抛出。
Errors
扩展Error类。它们是由JVM引发的,不应该被处理或
声明。
当方法抛出检查异常(1)时,你应该处理或重新启动它。
当方法抛出未经检查的异常(2)时,您可以处理或重新抛出它,但这不是强制性的。
但每当我把它作为Exception类抛出时,我总是会遇到错误 catch块(我将其重新抛出以便在main中处理)
这意味着您的方法抛出了应该处理或重新抛出的已检查异常。
处理:
public class Main {
public static void main(String[] args) {
try {
throw new Exception();
} catch (Exception e) {
try {
throw new Exception();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
重新抛出:
public class Main {
public static void main(String[] args) throws Exception {
try {
throw new Exception();
} catch (Exception e) {
throw new Exception();
}
}
}
在你的情况下:
// You declaring that the caller should handle exception
static void renderWorld() throws Exception {
try {
if(!enable3dRendering) {
System.out.println("3d rendering is disabled. Enable 3d mode to render.");
throw new Exception("3d mode Disabled.");
} else {
System.out.println("The World is Empty!");
}
} catch(Exception e) {
System.out.println("Please handle the error");
// You cannot just throw uncheked exception here
// You should handle it yourself or a caller should do it
throw e;
}
}
答案 1 :(得分:0)
更改
static void renderWorld() { ... }
到
static void renderWorld() throws Exception { ... }
应该解决这个问题。这是因为运行时异常是未经检查的异常。
建议您详细了解Checked和Unchecked异常 - Java: checked vs unchecked exception explanation。
答案 2 :(得分:0)
这是因为它们是几个从类 Exception 继承的异常类。每个人都可以被抛弃,但他们分成两组:
已选中和未选中例外:
由于可以检查和取消选中基本异常对象,因此编译器会关注每次都应该处理它。
如果您尝试将 NullPointerException 更改为 IOException ,则无法编译,因为它是 Checked Exception 。所以它只是随机的,你确切地找到了一种类型的 Exception ,你的代码可以在没有编译错误的情况下工作。
有关详细信息,请访问我的博客文章: http://www.zoltanraffai.com/blog/?p=93