我有这段代码:
public class Sample {
public static void useCallable(Callable<Integer> expression){}
public static void main(String[] args){
useCallable(()->{throw new IOException();});
}
}
编译并运行正常。
但是,Callable<Integer>
不应该将任何内容作为输入并返回整数?
()->{throw new IOException();}
没有返回任何内容,为什么它是有效的Callable<Integer>
表达式?
答案 0 :(得分:4)
出于同样的原因,这个方法编译:
clearvars
toss=0;
for i=1:500
if randi(2)==1 %1 for tails, 2 for heads
toss=toss+1;
else
FreqToss(i)=toss;
fprintf('Number of toss to obtain head %.0f \n',toss)
toss=0;
end
end
由于与此方法相同的原因编译:
Integer foo() throws Exception {
throw new IOException();
}
引用JLS,
如果声明方法具有返回类型(第8.4.5节),则如果方法体可以正常完成(第14.1节),则会发生编译时错误。
“正常完成”是什么意思?根据{{3}}(强调我的),
如果所有步骤都按照描述执行,没有突然完成的指示,则声明正常完成。但是,某些事件可能会阻止声明正常完成:
Integer foo() throws Exception { if (hasFoo()) { return getFoo(); } else { throw new IOException(); } }
(§14.15),break
(§14.16)和continue
(§14.17)语句导致转移控制权这可能会阻止正常完成包含它们的语句。对某些表达式的评估可能会从Java虚拟机中引发异常(第15.6节)。 明确的
return
(§14.18)语句也会导致异常。异常会导致控制权转移,从而阻止正常完成陈述。
换句话说,具有返回类型的方法必须 返回或抛出。你做的是后者,所以它是有效的。