2013-04-14 58 views
4

如果我有一个叫船类的,如果我写:优势声明异常

class Boat throws Exception 

里面我的课,我使用try catch块捕捉ArithmeticException例如。 有什么好处是宣布一个异常与不宣布异常?

+1

请参阅[this](http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html)。 – m0skit0

+4

'class'不会抛出异常。只有方法。 – Thilo

回答

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 

因为当方法抛出异常时,它们需要通过调用对象来处理,就像是在说'嘿有人处理异常',所以调用它的方法应该ndle异常,如果他们不这将是一个编译时错误。

为了顺利执行程序,方法抛出的异常应该通过调用方法来处理。这是你需要处理的方式。

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

} 
} 
+0

因此,声明方法的异常的唯一好处是允许使用该方法的另一个类捕获异常?请告诉我。 – Stranger

+1

@Stranger通过抛出你指定的异常,你的方法将抛出下面的异常。它只是说,当你使用这种方法时,它会抛出以下异常,你需要去处理它们。例如:'Class.forName(str)'将抛出CNF异常来指定使用此方法将导致CNF异常检查方法声明http://docs.oracle.com/javase/1.4.2/docs/api/java/ lang/Class.html#forName%28java.lang.String%29 – Pragnani

+1

“以允许使用该方法的另一个类捕获异常”。更喜欢强迫另一个类去思考如何处理异常(捕获或传播)。 – Thilo

2

声明异常将允许您的程序编译,如果任何异常可以由编译器确定“逃脱”。不过,它的主要目的是向你的方法的用户(以及它们的编译器)记录它可能抛出异常。

因此,宣布异常,vs宣布更具体的异常原因,是取消该计划的好处 - 作弊。

3
  • A class不会抛出异常。只有方法。

  • 对于一些异常(检查可能出现在您的代码中的异常,您无法捕获),编译器会强制您声明它们。

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

  • 您可以声明您的代码不会抛出的已检查异常。如果你以后想要抛出它们,这就使得它具有面向未来的可能性,并且也允许子类这样做。

  • 当声明异常时,可以使用广义/通用(throws Exception或甚至throws Throwable),但通常更好的是更具体。这给了人们使用你的代码更好的想法。拥有这些许多特定的Exception类的全部目的是为了更容易地处理异常(并且让编译器强制实施某人至少考虑过这样做的事实)。

2

如果你写类似的东西,

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

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

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

这将打印