kotlin:java.lang.nullpointerexception:指定为非null的参数是null,java 2 kotlin迁移

发布于 2025-02-06 22:07:12 字数 10293 浏览 3 评论 0原文

在将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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

留蓝 2025-02-13 22:07:12

适配器的工作方式是convertView可能是空的。这就是为什么在您的方法中您检查它是否为null并创建新视图(如果为null)。

在Kotlin中,您必须将此参数声明为无效,因为它可能为null。另外,您可以利用猫王操作员以获得更多简洁的代码:

override fun getDropDownView(position: Int, _convertView: View?, parent: ViewGroup): View {
    val convertView = _convertView ?:
        LayoutInflator.from(parent.context)
            .inflate(R.layout.subject_spinner_row, parent, false)
    val llLayout = super.getDropDownView(position, convertView, parent)
    roundCorners(parent)
    return llLayout
}

同样,如果您想能够从getItem()返回null,则必须将返回类型标记为nullable:

override fun getItem(i: Int): Any? {
    return null
}

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:

override fun getDropDownView(position: Int, _convertView: View?, parent: ViewGroup): View {
    val convertView = _convertView ?:
        LayoutInflator.from(parent.context)
            .inflate(R.layout.subject_spinner_row, parent, false)
    val llLayout = super.getDropDownView(position, convertView, parent)
    roundCorners(parent)
    return llLayout
}

Likewise, if you want to be able to return null from getItem(), you must mark the return type as nullable:

override fun getItem(i: Int): Any? {
    return null
}
东北女汉子 2025-02-13 22:07:12

我遇到了同样的问题,但是显然,预编译检查并未说出何时属性属性取决于将启动1行的属性。
即,

class FileBrowserViewModel : ViewModel() {
val tabDirs = mountPoints.map {
        TabDir(
            pathAddress = it,
            sortWith = comparator, //Not yet initiated, thus will throw this NullPointerException.
            scope = viewModelScope
        )
    }.toMutableStateList()
    val comparator = MutableStateFlow(egComparator)
}

这给出了相同的问题,但是如果我在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,

class FileBrowserViewModel : ViewModel() {
val tabDirs = mountPoints.map {
        TabDir(
            pathAddress = it,
            sortWith = comparator, //Not yet initiated, thus will throw this NullPointerException.
            scope = viewModelScope
        )
    }.toMutableStateList()
    val comparator = MutableStateFlow(egComparator)
}

This gives the same issue, but if I define comparator (independent property) before tabDirs (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.

年少掌心 2025-02-13 22:07:12
override fun getItem(position: Int): Any? {
    return null
}

只要添加“?”函数返回类型的无效类型,因为Kotlin使用无效的值与Java和基本适配器不同,并且使用Java使用Java:
Java中的对象等同于任何?没有

override fun getItem(position: Int): Any? {
    return null
}

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文