为什么lambda表达式的主体只能由throws语句组成?

时间:2017-02-28 03:57:41

标签: java lambda

我有这段代码:

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>表达式?

1 个答案:

答案 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)语句也会导致异常。异常会导致控制权转移,从而阻止正常完成陈述。

  •   

换句话说,具有返回类型的方法必须 返回或抛出。你做的是后者,所以它是有效的。