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方法