Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_Exception Handling_Return Type - Fatal编程技术网

Java 这是处理滥用的异常吗?

Java 这是处理滥用的异常吗?,java,exception-handling,return-type,Java,Exception Handling,Return Type,我有这个方法,可以返回三个不同的响应 起初,它应该只返回2,所以我将其返回类型设置为Boolean 比如: 并且一些业务逻辑产生,它可以有另一个结果,因此该方法被修改为 public static boolean isLoteWaitingForImage() throws ImageNotPendingException 如果某个select返回一个null值,但有一行返回true,如果不是null,我将返回false。如果未从选择中获取任何行,我将抛出一个ImageNotPendingE

我有这个方法,可以返回三个不同的响应

起初,它应该只返回2,所以我将其返回类型设置为Boolean

比如:

并且一些业务逻辑产生,它可以有另一个结果,因此该方法被修改为

public static boolean isLoteWaitingForImage() throws ImageNotPendingException 
如果某个
select
返回一个
null
值,但有一行返回
true
,如果不是
null
,我将返回
false
。如果未从
选择
中获取任何行,我将
抛出一个
ImageNotPendingException
异常,因为它不适用于
where
子句中的给定过滤器


也考虑过这样做,我有一个新的类,它的类型可以从方法
isLoteWaitingForImage()
返回,有3个常量属性,称为:

public class LoteResponse {
    public static int VALID = 1;
    public static int INVALID = 2;
    public static int NO_IMAGE_PENDING = 3;
}
因此,我将采用这种新方法:

public static int isLoteWaitingForImage() {

    return LoteResponse.VALID;
}

有了这个,我有两个问题:

  • 关于如何实现这一目标,还有什么“其他”想法吗?

  • 哪种方法更好?


是的,这对我来说似乎是一种虐待

如果在没有图像挂起时不应该调用该方法,则抛出异常是合理的。客户是否总能知道这一点?它是否代表了一个bug,或者在这种状态下调用它会出现严重错误?如果不是,请不要使用异常

在我看来,你需要一个枚举

public enum LoteResponseState
{
    Valid,
    Invalid,
    NoImagePending;
}

public static LoteResponseState getLoteState()
{
    ...
}

走例外的道路。它确实有一个更明确的调用方接口。如果调用方需要处理此ImageNotPendingException,请将其设置为选中异常

返回enum是一件奇怪的事情,因为它通过将业务细节和处理委托给调用方来减少封装。这样,打电话的人需要知道太多的事情

很抱歉我的英语不好。

  • 如果您希望调用isLoteWaitingForImage()
的代码直接负责处理“无图像挂起”条件以及其他条件,则使用多个返回值,但使用枚举,而不是int
  • 如果立即调用代码不能有效地处理“no image pending”条件,而通常会在调用堆栈的更高层处理,那么异常是更好的选择

  • 我绝对同意枚举是最佳选择


    一般来说,如果某个操作不被认为是很少发生的严重错误,则不应抛出异常。仅对当前方法无法有效处理的错误抛出异常,但不能作为典型的返回值。

    我不是专家,因此不要将此视为最佳实践建议,但我认为在这种特殊情况下使用异常似乎有点过火。我会选择上面提到的一些简单的返回值

    如果您真的想跟踪情况,无论出于何种调试或开发原因,您都可以抛出
    RuntimeException(“为什么抛出运行时异常”)
    。如果您没有对异常执行特定的操作,那么编写自己的异常似乎太过分了


    我希望这有点道理。:)

    完全不同意。异常非常昂贵(生成调用堆栈不是一件轻而易举的事),不应该用于有意的控制流。也许,也许不是。javax.persistence.Query令人讨厌,因为它为业务案例抛出运行时异常。封装指令怎么样?同意吗?不同意?例外情况应很少用于控制流。关于列举,我看不出你的逻辑。如果返回值没有强定义的含义,那么它如何用于任何事情?即使常量也有调用方应该知道的绝对含义;枚举只是更好地包装了它。为了学习,您能详细说明一下为什么不应该返回int吗?我原以为返回-1,0,1最简单,因为有三种可能。@posdef:因为无论是在编写代码还是试图读取代码时,都很容易忘记各个值的含义。命名这些条件可以避免维护问题。如果项目规模较大,并且状态和INT之间没有逻辑联系,我认为这是有意义的。在MATLAB中,经常使用负数返回错误/错误/错误的状态。@posdef-它们被称为幻数,当有多个更好的选择时,通常被认为是邪恶的。常量是更好的选择,而枚举是首选方法。枚举定义特定的约束,是更好的OO,并且很容易适应将来的添加。@posdef:enum有几个大优点:1)防止使用无效值。2) 防止对两个不同的对象使用相同的值。3) 它们是类型安全的(不能使用错误的常量)4)当值被传递或存储在某个位置时,名称仍然可用,并且您正在记录它或在调试中查看它。另一个问题,我有一个类,在这个类中,我有针对DB的那些方法验证。在同一个
    类中,我应该在哪里找到这些新的
    枚举
    ?@Garis:可以是嵌套的枚举,也可以是完全独立的枚举。这取决于你。
    public enum LoteResponseState
    {
        Valid,
        Invalid,
        NoImagePending;
    }
    
    public static LoteResponseState getLoteState()
    {
        ...
    }