2012-05-03 83 views
-1

我对Java的例外有基本的疑问如何为检查异常传播try catch块?

即,所有检查的异常从Exception类延伸,并且未检查的例外从RuntimeException延伸。但运行时异常也从Exception延伸。

但是为什么要传播try ... catch块已勾选Exceptions但未处于未经检查的异常?

+1

并非所有的unchecked异常自RuntimeException扩展。除此之外,我不确定你在问什么 - 你是否想知道Java编译器如何强制执行检查异常被声明或处理的要求? – Perception

+0

我认为这是一个非常好的问题,Error和它的子类也没有选中。我不确定,但我认为它们在编译器中被定义为被选中或未选中。 –

+0

是的。但Iam尝试与ArrayIndexOutOfBoundsException比较,空指针异常等 – user1357722

回答

0

一般来说,您应该针对您打算处理的每种特定类型的异常添加不同的catch块。如果您试图处理(通过重新抛出)已检查的异常,那么您应该知道重新抛出哪种类型的异常 - 只需添加一个catch块来重新抛出每个异常类型即可。

0

我想你是问,“我怎么能赶上Exception但不RuntimeException

你也许不应该试图这样做。你应该捕获特定类型的异常时可能的。如果你需要处理所有错误,那么你就应该抓住Exception,并且抓住一切。*

你很少会想这样做catch (NullPointerException),因为如果你知道你可以有一个null那么你应该检查它。如果你的代码是导致NullPointerExceptionArrayOutOfBoundsException那么你应该修复这些代码,以便它不再扔掉即

此代码应该告诉你怎么做你问什么:

public static void throwSomething(Exception throwMe) 
{ 
    try { 
     throw throwMe; 
    } 
    catch(Exception ex) { 

     // Check if the object is a RuntimeException 
     if(ex instanceof RuntimeException) { 
      // Throw the same object again. 
      // Cast to RuntimeException so the compiler will not 
      // require "throws Exception" on this method. 
      throw (RuntimeException) ex; 
     } 

     System.out.println("Caught an instance of a " + 
       ex.getClass().toString()); 
    } 
} 

*其实,catch(Throwable)将捕获的一切,包括Error秒。

+0

RuntimeException有一个异常超级Class.But检查异常可以把尝试... catch块。但未经检查的异常不会为什么? – user1357722

+0

你是什么意思? catch(NullPointerException e)'工作正常。 –

0

最简单的方法是这样的:

try { 
    //do stuff 
} catch(RuntimeException e) { 
    throw e; 
} catch(SpecificCheckedException e) { 
    //handle 
} catch(Exception e) { 
    //handle 
}