如果我有一个名为 Boat 的课程,并且如果我写:
class Boat throws Exception
例如,在我的课堂上,我使用 try catch 块来捕获 ArithmeticException。声明异常与不声明异常相比有什么好处?
如果我有一个名为 Boat 的课程,并且如果我写:
class Boat throws Exception
例如,在我的课堂上,我使用 try catch 块来捕获 ArithmeticException。声明异常与不声明异常相比有什么好处?
Aclass
不会抛出异常。只有方法可以。
对于某些异常(代码中可能出现但您没有捕获的已检查异常),编译器会强制您声明它们。
您永远不必声明 RuntimeExceptions(例如 ArithmeticException),但您可以。这用作文档。
您可以声明代码不会抛出的已检查异常。如果您以后可能想扔掉它们,这将使其面向未来,并且还允许子类这样做。
声明异常时,您可以使用广泛/通用(throws Exception
甚至throws Throwable
),但通常最好更具体。这使使用您的代码的人更好地了解预期的内容。拥有这么多特定的异常类的全部目的是为了更容易适当地处理异常(并让编译器强制执行至少有人考虑过这样做的事实)。
第一类不会抛出异常,只有方法会抛出
检查这个例子
class A
{
public A() throws Exception
{
int k=5/0;
}
}
public class B
{
public static void main(String[] args)
{
A a=new A();
}
}
当你运行上面你会得到编译时错误说
Unhandled exception type Exception
因为当任何方法抛出异常时,它们应该通过调用对象来处理,就像说'嘿,有人处理异常',所以调用它的方法应该处理异常,如果不这样做将是编译时错误.
为了程序的顺利执行,方法抛出的异常应该通过调用方法来处理。这是您需要处理的方式。
class A
{
public A() throws Exception
{
int k=5/0;
}
}
public class B
{
public static void main(String[] args)
{
try{
A a=new A();
}
catch(Exception e)
{
System.out.println("caught "+e);
}
}
}
如果编译器可以将任何异常确定为“转义”,则声明异常将允许您的程序编译。但是,它的主要目的是向您的方法的用户(以及他们的编译器)记录它可能会引发异常。
因此,声明异常,而不是声明更具体的异常原因,正在抵消该计划的好处——作弊。
如果你写这样的东西,
double x = 1/0;
System.out.print("hey");
它会给你一个例外,你的代码将停止,不会打印hey。但是如果你用 封装它try/catch
,它就不会停止。
try{
double x = 1/0;
}catch(ArithmeticException){}
System.out.print("hey");
这将打印hey。