2014-09-24 29 views
0

因此,请描述以下情形。我有两套类和接口。 ClassA,ClassB,ClassAInterfaceClassBInterfaceClassA在其几种方法中使用ClassB。来自ClassB的这些方法有时会抛出异常。在java中处理接口和类的异常

public class ClassA implements ClassAInterface { 
    public void example() { 
     ClassB test = new ClassB(); 
     ClassB.exampleTest(); 

     //more code using ClassB 
    } 
} 

public class ClassB implements ClassBInterface { 
    public void exampleTest() throws ExampleException() { 
     boolean tru = false; 
     if (tru) { 
     throw new ExampleException(); 
     } 
    } 
} 

让我遇到的问题是,我在ClassA.example()方法得到一个Unhandled Exception type ExampleException()错误。为什么会发生?我希望ClassB方法在特定情况下引发异常,并且表示它有时会抛出异常,因此为什么ClassA不能编译。为了解决这个问题,我不能在ClassA.example()上添加一个throws语句,因为它违反了ClassAInterface。如果我只是将ClassB.exampleTest()包装在try语句中,ClassA.example()的其余大部分都会抛出错误,因为ClassB表示有什么错误,您应该在该点抛出异常,这是抛出异常的全部要点。所以我不确定为什么会发生这种情况或者如何解决这个问题。

+0

好吧,可能你的决定不允许ClassA抛出异常是错误的。但是,如果您确信可以将ClassB的异常包装在RuntimeException(未选中)中,或者只是从ClassB中捕获并记录该异常。 – markspace 2014-09-24 22:21:12

+0

它发生是因为它们是Java中的规则,用于“检查”异常。如果你想责怪某人,那就责备John Goodenough。他撰写了关于例外的“开创性”文章,尽管他当时对这些文章的真正了解不多,从那时起我们一直坚持他的计划。 – 2014-09-24 22:32:45

回答

2

为什么代码拒绝编译?

这很正常。正如你所说,B.exampleTest()有时会引发异常。 A.example()调用B.exampleTest()并且没有发现任何异常。因此,即使异常并不总是发生,但有时也会发生。当它发生时,异常也被A.example()抛出。所以它必须被宣布或捕获。就像B.exampleTest()有时会抛出异常一样,A.example()有时也会抛出相同的异常。

现在,该怎么办?您有3个选择:

  1. 声明抛出异常:A.example()的调用者将不得不决定在这种情况下要做什么。
  2. 抓住它A.example(),并以某种方式处理它。
  3. 捕获它,将其包装在运行时异常(不必在throws子句中声明)中,并抛出此运行时异常。调用者将不得不处理这个运行时异常,但是不会有任何来自编译器的可以抛出异常的提示。