kotlin:java.lang.nullpointerexception:指定为非null的参数是null,java 2 kotlin迁移
在将customSubjectspinneradapter从java迁移到kotlin之后,我将获得下一个例外:
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter view
at com.xxx.xxx.activities.about.contact.CustomSubjectSpinnerAdapter.getView(Unknown Source:2)
at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:206)
at android.widget.Spinner.onMeasure(Spinner.java:614)
at androidx.appcompat.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:438)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1412)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.widget.ScrollView.onMeasure(ScrollView.java:452)
at android.view.View.measure(View.java:25466)
at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:995)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:747)
at android.view.View.measure(View.java:25466)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3397)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2228)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2486)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
迁移之前的适配器类(java)
class CustomSubjectSpinnerAdapter extends BaseAdapter {
final private String[] subjectOptions;
private final LayoutInflater inflter;
CustomSubjectSpinnerAdapter(Context applicationContext, String[] subjectOptions) {
this.subjectOptions = subjectOptions;
inflter = (LayoutInflater.from(applicationContext));
}
@Override
public int getCount() {
return subjectOptions.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
{
LayoutInflater vi = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.subject_spinner_row, null);
}
View llLayout = super.getDropDownView(position, convertView, parent);
roundCorners(parent);
return llLayout;
}
private void roundCorners(ViewGroup parent) {
View container2Round = ((View)parent.getParent());
if (container2Round!=null) {
GradientDrawable gd = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
new int[] {Color.WHITE, Color.WHITE});
int radius = AWScreen.dp2px(10);
gd.setCornerRadius(radius);
container2Round.setBackground(gd);
}
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = inflter.inflate(R.layout.subject_spinner_row, null);
TextView tvSubject = view.findViewById(R.id.subject);
tvSubject.setText(subjectOptions[i]);
if (subjectOptions[i].equals("")) tvSubject.setVisibility(View.GONE);
setListItemRoundedCorners(tvSubject, i);
if (i== subjectOptions.length - 1) {
int padding = AWScreen.sp2px(10, view.getContext());
tvSubject.setPadding(padding, padding, padding, padding);
}
return view;
}
private void setListItemRoundedCorners(TextView tvSubject, int i) {
if (i==1){
tvSubject.setBackgroundResource(R.drawable.rounded_border_top);
}else{
if (i==2){
tvSubject.setBackgroundResource(R.drawable.rounded_border_bottom);
}
}
}
}
迁移后的适配器类(kotlin)(kotlin)
internal class CustomSubjectSpinnerAdapter(
applicationContext: Context?,
private val subjectOptions: Array<String>
) : BaseAdapter() {
private val inflter: LayoutInflater
override fun getCount(): Int {
return subjectOptions.size
}
override fun getItem(i: Int): Any {
TODO("Not yet implemented")
}
override fun getItemId(i: Int): Long {
return 0
}
override fun getDropDownView(_position: Int, _convertView: View, _parent: ViewGroup): View {
var convertView: View? = _convertView
if (convertView == null) {
val vi =
_parent.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
convertView = vi.inflate(R.layout.subject_spinner_row, null)
}
val llLayout = super.getDropDownView(_position, convertView, _parent)
roundCorners(_parent)
return llLayout
}
private fun roundCorners(parent: ViewGroup) {
val container2Round = parent.parent as View
val gd = GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM, intArrayOf(Color.WHITE, Color.WHITE)
)
val radius = AWScreen.dp2px(10)
gd.cornerRadius = radius.toFloat()
container2Round.background = gd
}
override fun getView(i: Int, view: View, viewGroup: ViewGroup): View {
var view = view
view = inflter.inflate(R.layout.subject_spinner_row, null)
val tvSubject = view.findViewById<TextView>(R.id.subject)
tvSubject.text = subjectOptions[i]
if (subjectOptions[i] == "") tvSubject.visibility = View.GONE
setListItemRoundedCorners(tvSubject, i)
if (i == subjectOptions.size - 1) {
val padding = AWScreen.sp2px(10f, view.context)
tvSubject.setPadding(padding, padding, padding, padding)
}
return view
}
private fun setListItemRoundedCorners(tvSubject: TextView, i: Int) {
if (i == 1) {
tvSubject.setBackgroundResource(R.drawable.rounded_border_top)
} else {
if (i == 2) {
tvSubject.setBackgroundResource(R.drawable.rounded_border_bottom)
}
}
}
init {
inflter = LayoutInflater.from(applicationContext)
}
}
第一个是getItem中的汇编问题,
override fun getItem(i: Int): Any {
return null
}
它在提醒我,“ null不能成为一个值得null的价值非无效类型任何“
因此,我尝试
override fun getItem(i: Int): Any {
TODO("Not yet implemented")
}
- 最少 - 使其编译,但是上课后实例化:
private fun createSubjectSpinner() {
val contactUs = ContactUs()
val strSubject = AWLocale.getStringResourceByName("activityreportproblem_textview_subject")
val subjectOptions = arrayOf(
contactUs.leaveCommentLiteral,
contactUs.reportProblemLiteral,
contactUs.requestFeatureLiteral
)
val fullSpinnerArray =
arrayOf(strSubject, subjectOptions[0], subjectOptions[1], subjectOptions[2])
binding!!.spSubject.setOnTouchListener { v: View?, event: MotionEvent ->
if (event.action == MotionEvent.ACTION_UP) {
spinnerOnTouch(subjectOptions, binding!!.spSubject)
}
false
}
val customAdapter = CustomSubjectSpinnerAdapter(this, fullSpinnerArray)
binding!!.spSubject.adapter = customAdapter
}
提到的例外。我可以尝试解决这个问题?
After migrating CustomSubjectSpinnerAdapter from Java to Kotlin I'm getting the next exception:
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter view
at com.xxx.xxx.activities.about.contact.CustomSubjectSpinnerAdapter.getView(Unknown Source:2)
at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:206)
at android.widget.Spinner.onMeasure(Spinner.java:614)
at androidx.appcompat.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:438)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1412)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.widget.ScrollView.onMeasure(ScrollView.java:452)
at android.view.View.measure(View.java:25466)
at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:995)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.view.View.measure(View.java:25466)
at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
at android.view.View.measure(View.java:25466)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:747)
at android.view.View.measure(View.java:25466)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3397)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2228)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2486)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Adapter class before migration (Java)
class CustomSubjectSpinnerAdapter extends BaseAdapter {
final private String[] subjectOptions;
private final LayoutInflater inflter;
CustomSubjectSpinnerAdapter(Context applicationContext, String[] subjectOptions) {
this.subjectOptions = subjectOptions;
inflter = (LayoutInflater.from(applicationContext));
}
@Override
public int getCount() {
return subjectOptions.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
{
LayoutInflater vi = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.subject_spinner_row, null);
}
View llLayout = super.getDropDownView(position, convertView, parent);
roundCorners(parent);
return llLayout;
}
private void roundCorners(ViewGroup parent) {
View container2Round = ((View)parent.getParent());
if (container2Round!=null) {
GradientDrawable gd = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
new int[] {Color.WHITE, Color.WHITE});
int radius = AWScreen.dp2px(10);
gd.setCornerRadius(radius);
container2Round.setBackground(gd);
}
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = inflter.inflate(R.layout.subject_spinner_row, null);
TextView tvSubject = view.findViewById(R.id.subject);
tvSubject.setText(subjectOptions[i]);
if (subjectOptions[i].equals("")) tvSubject.setVisibility(View.GONE);
setListItemRoundedCorners(tvSubject, i);
if (i== subjectOptions.length - 1) {
int padding = AWScreen.sp2px(10, view.getContext());
tvSubject.setPadding(padding, padding, padding, padding);
}
return view;
}
private void setListItemRoundedCorners(TextView tvSubject, int i) {
if (i==1){
tvSubject.setBackgroundResource(R.drawable.rounded_border_top);
}else{
if (i==2){
tvSubject.setBackgroundResource(R.drawable.rounded_border_bottom);
}
}
}
}
Adapter class after migration (Kotlin)
internal class CustomSubjectSpinnerAdapter(
applicationContext: Context?,
private val subjectOptions: Array<String>
) : BaseAdapter() {
private val inflter: LayoutInflater
override fun getCount(): Int {
return subjectOptions.size
}
override fun getItem(i: Int): Any {
TODO("Not yet implemented")
}
override fun getItemId(i: Int): Long {
return 0
}
override fun getDropDownView(_position: Int, _convertView: View, _parent: ViewGroup): View {
var convertView: View? = _convertView
if (convertView == null) {
val vi =
_parent.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
convertView = vi.inflate(R.layout.subject_spinner_row, null)
}
val llLayout = super.getDropDownView(_position, convertView, _parent)
roundCorners(_parent)
return llLayout
}
private fun roundCorners(parent: ViewGroup) {
val container2Round = parent.parent as View
val gd = GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM, intArrayOf(Color.WHITE, Color.WHITE)
)
val radius = AWScreen.dp2px(10)
gd.cornerRadius = radius.toFloat()
container2Round.background = gd
}
override fun getView(i: Int, view: View, viewGroup: ViewGroup): View {
var view = view
view = inflter.inflate(R.layout.subject_spinner_row, null)
val tvSubject = view.findViewById<TextView>(R.id.subject)
tvSubject.text = subjectOptions[i]
if (subjectOptions[i] == "") tvSubject.visibility = View.GONE
setListItemRoundedCorners(tvSubject, i)
if (i == subjectOptions.size - 1) {
val padding = AWScreen.sp2px(10f, view.context)
tvSubject.setPadding(padding, padding, padding, padding)
}
return view
}
private fun setListItemRoundedCorners(tvSubject: TextView, i: Int) {
if (i == 1) {
tvSubject.setBackgroundResource(R.drawable.rounded_border_top)
} else {
if (i == 2) {
tvSubject.setBackgroundResource(R.drawable.rounded_border_bottom)
}
}
}
init {
inflter = LayoutInflater.from(applicationContext)
}
}
The first is a compilation problem in getItem
override fun getItem(i: Int): Any {
return null
}
It's alerting me that "Null can not be a value of a non-null type Any"
so I've tried
override fun getItem(i: Int): Any {
TODO("Not yet implemented")
}
To -at least- make it compile, but after class in instantiated in:
private fun createSubjectSpinner() {
val contactUs = ContactUs()
val strSubject = AWLocale.getStringResourceByName("activityreportproblem_textview_subject")
val subjectOptions = arrayOf(
contactUs.leaveCommentLiteral,
contactUs.reportProblemLiteral,
contactUs.requestFeatureLiteral
)
val fullSpinnerArray =
arrayOf(strSubject, subjectOptions[0], subjectOptions[1], subjectOptions[2])
binding!!.spSubject.setOnTouchListener { v: View?, event: MotionEvent ->
if (event.action == MotionEvent.ACTION_UP) {
spinnerOnTouch(subjectOptions, binding!!.spSubject)
}
false
}
val customAdapter = CustomSubjectSpinnerAdapter(this, fullSpinnerArray)
binding!!.spSubject.adapter = customAdapter
}
The mentioned exception is thrown. What can I try to resolve this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
适配器的工作方式是
convertView
可能是空的。这就是为什么在您的方法中您检查它是否为null并创建新视图(如果为null)。在Kotlin中,您必须将此参数声明为无效,因为它可能为null。另外,您可以利用猫王操作员以获得更多简洁的代码:
同样,如果您想能够从
getItem()
返回null,则必须将返回类型标记为nullable:The way Adapter works is that the
convertView
might be null. That’s why in your method you check if it’s null and create a new view if it is null.In Kotlin, you must declare this parameter as nullable, since it might be null. Also you can take advantage of the Elvis operator for more concise code:
Likewise, if you want to be able to return null from
getItem()
, you must mark the return type as nullable:我遇到了同样的问题,但是显然,预编译检查并未说出何时属性属性取决于将启动1行的属性。
即,
这给出了相同的问题,但是如果我在
tabdirs
(依赖属性)之前定义比较
(独立属性),则该问题已修复。如果这是无效的,为什么我在编译时不得到它,但是在运行时,我不知道。I was having the same issue, but apparently pre-compile check doesn't say about when a class property is dependent on a property that will initiate 1 line after.
ie,
This gives the same issue, but if I define
comparator
(independent property) beforetabDirs
(dependent property), the issue is fixed. If this was invalid, why I don't get it at compile time but at runtime, I don't know.只要添加“?”函数返回类型的无效类型,因为Kotlin使用无效的值与Java和基本适配器不同,并且使用Java使用Java:
Java中的对象等同于任何?没有
just add "?" nullable type for the function return type ,because kotlin using nullable value unlike java and base adapter using java under the hood :
Object in java is equivalent to Any? not to Any