从一个异常堆栈学习java的lambda表达式

2021-08-13 10:22:14.464 12589-12589/com.sohu.sohuvideo E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.sohu.sohuvideo, PID: 12589
    java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
        at com.sohu.sohuvideo.paysdk.ui.SohuMoviePopCommoditiesView.lambda$new$0$SohuMoviePopCommoditiesView(SohuMoviePopCommoditiesView.java:121)
        at com.sohu.sohuvideo.paysdk.ui.-$$Lambda$SohuMoviePopCommoditiesView$2jzMDgdSRhkiUsitsdx5W5MdoI0.onPayMethodSelected(Unknown Source:2)
        at com.sohu.sohuvideo.ui.view.PayListLayout.lambda$new$1$PayListLayout(PayListLayout.java:162)
        at com.sohu.sohuvideo.ui.view.-$$Lambda$PayListLayout$j6cs2Ey-RBpEE7eFy_rN3V2Z-dw.getMethod(Unknown Source:2)
        at com.sohu.sohuvideo.ui.view.PayListLayout.createPayMethodListView(PayListLayout.java:101)
        at com.sohu.sohuvideo.ui.view.PayListLayout.updatePayMethodList(PayListLayout.java:52)
        at com.sohu.sohuvideo.paysdk.ui.SohuMoviePopCommoditiesView.showPayMethodView(SohuMoviePopCommoditiesView.java:307)
        at com.sohu.sohuvideo.paysdk.ui.SohuMoviePopCommoditiesView.setCommodities(SohuMoviePopCommoditiesView.java:182)
        at com.sohu.sohuvideo.mvp.ui.fragment.popup.MVPPopUpMemberFragment$sendCommditiesListHttpRequest$1.onSuccess(MVPPopUpMemberFragment.kt:211)
        at com.common.sdk.net.connect.http.OkhttpManager$1.onSuccess(OkhttpManager.java:252)
        at com.common.sdk.net.connect.http.cronet.CronetRequestPool$3$3.run(CronetRequestPool.java:338)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:6990)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

大家看堆栈中出现了很多Lambda和$的字符串,你知道是什么意思吗?

at com.sohu.sohuvideo.ui.view.-$$Lambda$PayListLayout$j6cs2Ey-RBpEE7eFy_rN3V2Z-dw.getMethod(Unknown Source:2)
首先-$$Lambda$PayListLayout$j6cs2Ey-RBpEE7eFy_rN3V2Z-dw是一个整体,它后面跟着一个getMethod方法,说明它是一个类名。但是这个类名很奇怪,知道是编译器帮我自动生成的。
因为我们使用的是lambda形式的匿名内部类,所以编译器才这样生成类名

    private VipMethodView.ClickBox mClickBox = payMethod -> {
        selectMethodView(payMethod);
        if (mPayMethodSelectedListener != null) {
            mPayMethodSelectedListener.onPayMethodSelected(payMethod);
        }
    };

-$$估计是开头的固定形式吧
Lambda表示是个lambda表达式
$用来分割吧,没啥含义
PayListLayout表示是在这个类里
j6cs2Ey-RBpEE7eFy_rN3V2Z-dw这个是内部规则生成的一个字符串
这一大串构成了匿名内部类的类名

at com.sohu.sohuvideo.ui.view.PayListLayout.lambda$new$1$PayListLayout(PayListLayout.java:162)

lambda$new$1$PayListLayout这个就是方法名了,这个也是编译器自动生成的,它把上面lambda表达式的函数体提成一个方法放到PayListLayout中,就相当于匿名内部类中的函数调用了PayListLayout中函数,大家可以反编译打好的包,就能看到是不是这样的。
这个方法名的生成也是有规则的,1编号表示:有几个lambda表达式从1开始编号
在这里插入图片描述

在这里说一句,Integer自动拆箱是调用了Integer的intValue方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值