2009-11-08 132 views
1

的子类,我有以下接口声明:声明为抛出异常的方法签名;实现抛出异常

public interface SomeInterface { 

    void someMethod() throws Exception; 

} 

我使用第三方生成这个类的实现(JavaCC的 - 为好奇)

生成的类长相天真是这样的:

public class SomeClass implements SomeInterface { 

    public void someMethod() throws SomeException { 

    // Does something 

    } 
} 

哪里SomeException当然是Exception一个子类。

(不)令人惊讶的代码不编译。

有没有人对此有任何意见?

谢谢!

EDIT

更名方法SomeMethod()someMethod()

它已经是我的错字......(对不起)

编辑#2:

对不起所有 - 我的巨大的错误。写这个例子迫使我去掉代码。我没有注意到这个错误是在其他地方,而不是签名。

多数民众赞成在运行时编译和自定义类装载的“魔术” ......

+0

“任何输入?”这不是一个明确答案的问题。 – 2009-11-08 16:30:37

+0

发布的代码将被编译。你能重现这个示例代码的问题吗? – Yishai 2009-11-08 16:38:35

+1

我的一个巨大的错误。由于我不得不剥夺这个例子的代码,我没有注意到这个问题已经在其他地方......真的很抱歉! – Yaneeve 2009-11-08 16:49:44

回答

1

它不会编译,因为方法名是不一样的(检查S上帽/的someMethod)

+0

但是,如果你解决这个问题,它应该编译好。 – 2009-11-08 16:05:01

+0

只是在StackOverflow错字... – Yaneeve 2009-11-08 16:10:22

+2

但编译: import java.io.*; 接口SomeInterface void someMethod()throws Exception; } 类SomeClass的实现SomeInterface { 公共无效的someMethod()抛出IOException异常{ //请问什么 }} 所以问题一定是别的东西... – 2009-11-08 16:25:45

1

在Java中,案例很重要。你的界面显示someMethod,你的班级显示SomeMethod

+0

只是在StackOverflow上一个错字。 .. – Yaneeve 2009-11-08 16:13:36

0

为什么你的接口方法抛出异常?这几乎总是错误的。异常只是其余的基础类型;这并不意味着以这种方式使用。

+0

它是因为类加载问题...生成该类的代码还会生成异常,该异常将在与接口不同的类加载器中加载。据我所知,我的界面使用相同的异常类型,因为它永远不会相同。现在有点更清楚了吗? – Yaneeve 2009-11-08 16:34:55

+0

偶尔有这样做的理由:它说该方法可以抛出一个特定于实现的检查异常。例如,考虑可以写入数据库或文件的持久性机制。一个抛出SQLException,另一个抛出IOException。无论哪种情况,应用程序都需要在写入失败时捕获异常,并采取一些操作(从简单地将RuntimeException /子类打包到生成自定义错误页面/对话框)。 – kdgregory 2009-11-13 13:15:49

+0

接口方法抛出有什么问题?如果实现需要抛出,你是否建议不加选择地抛出,这会被接口无证的?这看起来完全错误。 – user443854 2012-11-29 14:52:16

0

其中一种方法保护是公开的,另一种是默认的,这就是为什么你的代码不能编译。使公共或默认。