仅在未抛出异常时返回

时间:2015-07-11 07:18:38

标签: java exception-handling return

我在java中实现了一个固定大小的Queue,它使用一个常量大小的ArrayList作为底层容器,我的 front()方法应该返回Queue的前面元素。

   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()仅在没有抛出Exception的情况下返回值,但是正如预期的编译器显示“缺少返回语句”。 “那么,有没有办法只有在没有抛出Exception的情况下才能使函数返回。

4 个答案:

答案 0 :(得分:3)

由于您在代码中捕获异常,因此编译器显示缺少return语句错误。

你可以实现像这样的功能:

public T front() throws Exception {

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

    return arrayList.get(frontIndex);
}

最后在调用function / client

时处理异常

答案 1 :(得分:1)

  

我希望front()仅在没有抛出异常的情况下返回值

修辞问题:如果抛出异常,你想要返回什么?

这是问题所在。您已将front()声明为返回某些内容(T的实例)。这意味着有两种相关的方式 1 来终止对front()的调用:

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

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

您无法返回"没有",因为front()必须返回一个值。

您无法抛出已检查的异常(例如Exception),因为front()未被声明为抛出任何异常。

那你能做什么?

  • 您可以更改方法签名,以便抛出SomeException,其中SomeException来自Exception。 (投掷Exception是一个非常糟糕的主意......)

  • 您可以将throw new Exception更改为throw new SomeException,其中SomeException来自RuntimeException

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

1 - 实际上,还有其他几种方法,但它们在这种情况下没有用处。例如,您可以调用System.exit(int)并终止JVM。 (并且有一些方法可以构建代码,以便在return调用之后不需要(冗余)throwexit。提示:无限循环不会在'需要返回。)

答案 2 :(得分:0)

如果您之后捕获它,为什么要使用该例外?您必须返回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);
    }

您还应该使用更具体的例外,而不是例外。

答案 3 :(得分:0)

此“示例”显示了你可以抛出异常并返回值

的可能性
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 */

}

编辑:

我尝试使用两个不同的VM,令我惊讶的是抛出异常第二个是跳过catch块并执行代码,因此它取决于VM的实现