Java 仅当未引发异常时返回

Java 仅当未引发异常时返回,java,exception-handling,return,Java,Exception Handling,Return,我正在java中实现一个固定大小的队列,它使用一个固定大小的ArrayList作为底层容器,其中我的front()方法应该返回队列的front元素 public T front(){ try{ if(isEmpty()) throw new Exception("Queue is Empty- can't return Front element."); return arrayList.g

我正在java中实现一个固定大小的队列,它使用一个固定大小的ArrayList作为底层容器,其中我的front()方法应该返回队列的front元素

   public T front(){


        try{
            if(isEmpty())
                throw new Exception("Queue is Empty- can't return Front element.");
            return arrayList.get(frontIndex);

        }catch (Exception e){
            System.out.println(e);
        }

    }

通过以上述方式编码,我希望front()仅在未引发异常时返回一个值,但正如预期的那样,编译器向我显示“缺少返回语句”,只有在没有抛出异常的情况下,我才可以让函数返回。如果在事后捕获异常,为什么还要使用异常?您必须返回
T
或抛出异常。但是该方法不会抛出异常,因为您正在捕获它。这样做难道不容易吗:

   public T front() throws SomeException{ // if SomeException is checked you need to declare it
        if(isEmpty())
            throw new SomeException("Queue is Empty- can't return Front element.");
        return arrayList.get(frontIndex);
    }

您还应该使用更具体的异常,而不是异常。

因为您在代码中捕获异常,编译器显示缺少返回语句错误

您可以实现如下功能:

public T front() throws Exception {

    if(isEmpty()) {
       throw new Exception("Queue is Empty- can't return Front element.");
    }

    return arrayList.get(frontIndex);
}
最后在调用函数/客户端时处理异常

我希望front()仅在没有引发异常时返回一个值

反问:如果抛出异常,您希望返回什么

问题就在这里。您已将
front()
声明为返回某物(一个
T
的实例)。这意味着有两种相关的方法1可以终止对
front()
的调用:

  • 它可以通过返回符合类型
    T
    的内容来正常终止

  • 它可以通过抛出未经检查的异常而异常终止

您不能返回“nothing”,因为
front()
必须返回一个值

您不能抛出选中的异常(如
exception
),因为
front()
未声明为抛出任何异常


那你能做什么呢

  • 您可以更改方法签名,以便抛出
    SomeException
    ,其中
    SomeException
    Exception
    派生。(抛出异常是一个非常糟糕的主意…)

  • 您可以将
    throw new Exception
    更改为
    throw new SomeException
    ,其中
    SomeException
    RuntimeException
    的后代

  • 假设
    T
    是引用类型,则可以返回
    null
    。(如果
    T
    是类型参数,则为。)


1-事实上,还有两种其他方法,但它们在这种情况下并不有用。例如,您可以调用
System.exit(int)
并终止JVM。(还有一些构造代码的方法,这样您就不需要在
退出
调用后使用(冗余的)
返回
抛出
。提示:无限循环不需要返回。)

这个“示例”显示了u可以抛出异常和返回值的可能性

private boolean throwExReturnValue() throws NullPointerException {

    try {

       throw new NullPointerException("HAHA");
    }

    finally {

        return true;
    }
}

private void ExceptionHanler() {

     boolean  myEx; 

     try { 

       myEx = throwExReturnValue(); 

       /** code here will still execute & myEx will have value = true */

     } catch (Exception ex) {

       /** will execute or not (depending on VM) even we throwed an exception */

     }

    /** code will still execute */

}
编辑:


我在两个不同的虚拟机上尝试了这一点,但令我惊讶的是,一个是抛出异常,另一个是跳过catch块并执行代码,因此这取决于虚拟机的实现,而不是在方法本身中,异常和错误的区别是什么?错误永远不应该被忽略caught@TomaszBest,那么,异常是一种处理异常情况而不让程序突然终止的机制,因此抛出异常而不是错误更适合我的问题。@user140547,您能否给出一些原因,说明为什么异常通常不会在生成异常的方法中被捕获?如果该方法具有非
void
返回类型,则必须返回值或抛出异常。没有其他选择。您想在这两个选项中做什么?即使您调用
System.exit(int)
,您仍然必须返回一个值或抛出一个异常;编译器不知道程序流在调用
System.exit(int)
后停止。修辞性我可以返回任何t类型或null的内容,即使出现异常。谢谢,你的修辞性问题让我明白了,我很感激@TomaszBest-你没有强调“想要”这个词。这正是我想表达的观点。@stephen-c我在你的解释中看不到第三种可能性:1)throw-ex,2)return-object-t-type或null,3)throw-ex-return-t-type-object或null,看看我的答案是什么意思