Rob*_*gle 2 java oop exception nosuchelementexception nosuchfieldexception
除了是NoSuchFieldException受检查异常之外,哪里NoSuchElementException不是,这两种异常有什么区别呢?什么时候应该使用其中一种而不是另一种?
具体来说,我正在研究一种 OOP 表示来封装Valve Server 查询 A2S_INFO Packets,其中某些值可以存在或不存在,具体取决于 的值Extra Data Flag (EDF)(更具体地说,可以使用按位 AND 和给定的值来测试这些值的存在常量。) getter 方法应该提供该值(如果存在),如果不存在则抛出异常。这就是最初的问题的来源,因为我不知道在这里使用什么更有利。
下面的代码显示了字段的 getter 方法之一,该字段可能存在或不存在,具体取决于 EDF 的值:
public long getSteamID(){
if(containsSteamID){
return steamID;
}else{
//Should NoSuchElementException be used here or NoSuchFieldException?
throw new NoSuchElementException("There is no steamID in this packet.");
}
}
Run Code Online (Sandbox Code Playgroud)
NoSuchFieldException用于基于反射的访问,它(引用文档)“表明 [Java] 类没有指定名称的字段。” 该文档还显示了(至少对于已检查的异常)抛出该异常的 JDK 方法。由于您没有使用Java反射,NoSuchFieldException似乎不合适。
NoSuchElementException可能合适,但它(至少对于 JDK)主要用于泛型集合和容器类。
也许IllegalStateException更适合您的情况:
表示某个方法在非法或不适当的时间被调用。换句话说,Java 应用程序未处于适合所请求操作的状态。
但是,如果您正在设计一个包装器库,那么定义您自己的异常类(可能作为异常层次结构的一部分)可能是最好的解决方案。这使您可以自由地决定是否应检查异常并为其指定一个有意义的名称。这样,您的库的用户可以直接看到异常来自您的库,并且可能比泛型更好地处理异常,泛型NoSuchElementException也可能由完全不相关的代码引发。