Java 仅当未引发异常时返回
我正在java中实现一个固定大小的队列,它使用一个固定大小的ArrayList作为底层容器,其中我的front()方法应该返回队列的front元素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
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
- 它可以通过抛出未经检查的异常而异常终止
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,看看我的答案是什么意思