4

如果我有一个名为 Boat 的课程,并且如果我写:

class Boat throws Exception

例如,在我的课堂上,我使用 try catch 块来捕获 ArithmeticException。声明异常与不声明异常相比有什么好处?

4

4 回答 4

3
  • Aclass不会抛出异常。只有方法可以。

  • 对于某些异常(代码中可能出现但您没有捕获的已检查异常),编译器会强制您声明它们。

  • 您永远不必声明 RuntimeExceptions(例如 ArithmeticException),但您可以。这用作文档。

  • 您可以声明代码不会抛出的已检查异常。如果您以后可能想扔掉它们,这将使其面向未来,并且还允许子类这样做。

  • 声明异常时,您可以使用广泛/通用(throws Exception甚至throws Throwable),但通常最好更具体。这使使用您的代码的人更好地了解预期的内容。拥有这么多特定的异常类的全部目的是为了更容易适当地处理异常(并让编译器强制执行至少有人考虑过这样做的事实)。

于 2013-04-14T12:51:26.153 回答
2

第一类不会抛出异常,只有方法会抛出

检查这个例子

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);
}

}
}
于 2013-04-14T13:11:37.983 回答
2

如果编译器可以将任何异常确定为“转义”,则声明异常将允许您的程序编译。但是,它的主要目的是向您的方法的用户(以及他们的编译器)记录它可能会引发异常。

因此,声明异常,而不是声明更具体的异常原因,正在抵消该计划的好处——作弊。

于 2013-04-14T12:50:55.227 回答
2

如果你写这样的东西,

double x = 1/0; 
System.out.print("hey");

它会给你一个例外,你的代码将停止,不会打印hey。但是如果你用 封装它try/catch,它就不会停止。

try{
    double x = 1/0; 
}catch(ArithmeticException){}
System.out.print("hey");

这将打印hey

于 2013-04-14T12:51:29.450 回答