Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 记录接口引发的运行时异常_Java_Documentation_Javadoc - Fatal编程技术网

Java 记录接口引发的运行时异常

Java 记录接口引发的运行时异常,java,documentation,javadoc,Java,Documentation,Javadoc,我有以下界面: public interface DataReceiver { public Data getData(); } 具体的接收器有不同的数据源,因此引发不同的异常: public class DeviceDataReceiver implements DataReceiver { // Gets data from some hardware device // Exceptions include: DeviceNotConnected, DeviceN

我有以下界面:

public interface DataReceiver {
    public Data getData();
}
具体的接收器有不同的数据源,因此引发不同的异常:

public class DeviceDataReceiver implements DataReceiver {
    // Gets data from some hardware device
    // Exceptions include: DeviceNotConnected, DeviceNotLicensed, RequestTimeout, etc
    public Data getData() { ... }
}

public class FileDataReceiver implements DataReceiver {
    // Gets data from a file on disc
    // Exceptions include: FileNotFound, BadFormat
    public Data getData() { ... }
}
我使用
@throws
Javadoc标记在相应的类中记录了这些运行时异常

我正在努力解决的是如何记录接口,因为这将是我的库的用户在遇到错误时首先看到的东西(我在整个公共API中使用接口,而不是具体的类)。记录派生类的所有异常对我来说不是很有吸引力,因为它们根本没有关系

这种情况下有什么最佳实践吗

我正在努力解决的是如何记录接口,因为它 当我的图书馆的用户得到一个 错误(我在整个公共API中使用接口,而不是 混凝土类)。记录衍生产品的所有例外情况 课程对我来说不是很有吸引力,因为它们没有 没有关系

如果您想记录这些异常,我认为您认为它们是客户端处理的例外。如果是这样,为什么不使用选中的异常呢
我知道有两种思考方式,但问自己这个问题很有趣

如果您认为这些异常不是原始的检查和处理(或抛出),我也不认为您需要在接口中引用这些异常。此外,理论上,接口不应该在其规范中与实现耦合。
但是,您可以在接口方法中指定,根据实现,它可能抛出

RuntimeException
子类。
此外,如果您掌握了这些异常的代码源,也许您可以为祖先异常使用一个抽象类,并将您的子类继承到此抽象类。通过这种方式,您可以在接口中记录这个超级异常

最后,您的设计鼓励您的客户在使用DataReceiver子类时不要按接口编程,因为否则客户会冒没有特定javadoc的风险,并且他们不会直接看到可能抛出使用的实现方法的特定异常。

所以,也许你也应该在界面上精确

我可以写一本关于Java中检查异常和未检查异常的思考过程的书,但基本上可以归结为:我不喜欢用throws声明捕获子类并将其弄乱。你回答的最后一部分是非常正确的,你认为我应该返回我的DataReceiver的具体类并仅仅希望。客户机在代码中使用接口将其程序与具体的DataReceiver分离?“这归结为:我不喜欢用抛出声明捕获子类并使其混乱。”我同意。如果具体类有太多的特殊性,我宁愿将它们声明为声明的类型,而不是接口;当我使用
TreeMap
时,我更喜欢声明
TreeMap TreeMap=new TreeMap()
而不是
Map Map=new TreeMap()
,因为我想知道TreeMap的特殊性。那么客户机处理
FileNotFound
是否应该与处理
DeviceNotLicensed
异常不同呢?毕竟,如果您有一个通用接口,未来的实现可能会抛出不同类型的异常,客户端通常无法知道它使用的是哪种类型的实现…
FileNotFoundException
是一个选中的异常,因此
FileDataReceiver
当前需要包装并重新播放它(以及任何其他选中的异常)作为一个
RuntimeException
,对吗?@MickMnemonic Yes,它可以实现atm。也许然后您可以创建自己的异常类型,扩展
RuntimeException
,并在接口文档中声明要抛出的异常类型。然后,实现将使用它包装异常,您可以在客户机代码中捕获此异常,而不是
RuntimeException
。听起来根异常对客户端来说并不重要(除了日志记录),因为这些情况通常是不可恢复的。@MickMemonic我将这样做,并重新考虑我的设计文档,以解决davidxxx在回答的最后一部分中提出的问题。非常感谢。