You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin代码中Course类grade字段返回null?如何修复?

问题:无效分数未正确设置为6.0的修复方案

运行以下Kotlin代码后,控制台输出Physics和Chemistry的grade字段为null。期望设置无效分数(如0.7、6.3)时,grade字段被设为6.0,但当前的setter逻辑未实现该效果,需要修复。

控制台输出

Math: 5.0
false

English: 3.0
true

Physics: null
false

Chemistry: null
false

原代码

class Course(
    val name: String
){
    var grade: Double? = null
        set(value){
            try {
                if (value != null && value >= 1.0 && value <= 6.0){
                    field = value
                }

            } catch ( e: NullPointerException ){
                field = 6.0
            }
        }

    var passed: Boolean? = null
        get(){
            return (this.grade ?:6.0) <= 4.0
        }

}

fun main(){
    val math = Course (" MATH ")
    math.grade = 5.0 //valid

    val english = Course (" ENGLISH ")
    english.grade = 3.0 // valid

    val physics = Course (" PHYSICS ")
    physics.grade = 0.7 // invalid

    val chemistry = Course (" CHEMISTRY ")
    chemistry.grade = 6.3 // invalid

    println("Math: " + math.grade )
    println( math.passed )
    println()

    println("English: " + english.grade )
    println( english.passed )
    println()

    println("Physics: " + physics.grade )
    println( physics.passed )
    println()

    println("Chemistry: " + chemistry.grade )
    println( chemistry.passed )
    println()

}

问题分析与修复方案

原setter的问题

  1. 仅当value处于有效范围(1.0~6.0)时才给field赋值,无效情况(如0.7、6.3)未处理,field保持初始的null
  2. 捕获NullPointerException毫无意义,代码中已经判断value != null,不会触发该异常

修复后的setter逻辑

  • 若value不为null且在1.0~6.0范围内,直接赋值给field
  • 其他所有情况(value为null或超出范围),将field设为6.0

修复后的完整代码

class Course(
    val name: String
){
    var grade: Double? = null
        set(value){
            field = if (value != null && value >= 1.0 && value <= 6.0) {
                value
            } else {
                6.0
            }
        }

    var passed: Boolean? = null
        get(){
            return (this.grade ?:6.0) <= 4.0
        }

}

fun main(){
    val math = Course (" MATH ")
    math.grade = 5.0 //valid

    val english = Course (" ENGLISH ")
    english.grade = 3.0 // valid

    val physics = Course (" PHYSICS ")
    physics.grade = 0.7 // invalid

    val chemistry = Course (" CHEMISTRY ")
    chemistry.grade = 6.3 // invalid

    println("Math: " + math.grade )
    println( math.passed )
    println()

    println("English: " + english.grade )
    println( english.passed )
    println()

    println("Physics: " + physics.grade )
    println( physics.passed )
    println()

    println("Chemistry: " + chemistry.grade )
    println( chemistry.passed )
    println()

}

修复后输出效果

运行代码后,Physics和Chemistry的grade会被设置为6.0,passed为false,符合预期:

Math: 5.0
false

English: 3.0
true

Physics: 6.0
false

Chemistry: 6.0
false

内容的提问来源于stack exchange,提问作者Emirhan Hans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:55:00