第6章

Null safety Exception 

為什麼需要Null 

Null 表示沒有

NullPointerException

String string = null;
string.length();

Runtime才能知道錯誤

Null Safety

//可以null
var name: String?

//不能null
var name2: String

可Null

var name: String? = null
println(name.length)

可Null

function的參數

fun main() {
    var name: String? = null
    setName(name)
}

fun setName(str: String) {
    //不可能會有null進來了
}

fun setName2(str: String?) {
    //要處理null
}

可Null

回傳型別

fun main() {
    var str = getName()
}

fun getName() : String?{
    return "A"
}

回傳型別

fun main() {
    getLocation("地址")
}

//找座標,用Location?來表示找不到
fun getLocation(address: String) : Location?{
    if(找不到){
        return null
    }
    return Location(22.22,124.22)
}

class Location (val lat:Double, val lng:Double)

宣告為不能null

var name2 = "A"
name2 = null

Elvis operator

var lenght = name?.length ?: 0

Primitive type

var a: Int ? 

var b:Boolean?

Exception

Exception

Exception 用來表達程式出了問題

throw Exception("Hi There!")

為什麼要丟出Exception

fun division(a:Int, b:Int) :Int{
    if (b == 0) {
        throw Exception("b不可為0")
    }
    return a/b
}

IllegalStateException

在不適合的時間呼叫此方法

Catch Exception

try {
    // some code
}
catch (e: SomeException) {
    // handler
}
finally {
    // optional finally block
}

不要忽略錯誤

try {
    log.append(message)
}
catch (IOException e) {
    // Must be safe
}

Exception之後

自定義Exception

fun main() {
    try {
        callAPI()
    }catch (e:Exception){
        when (e) {
            is APIFail -> {
                println("API Fail的處理")
            }
            is APIForbidden -> {
                println("API Forbidden 的處理")
            }
        }
    }
}


fun callAPI(): String {
    throw APIFail()
}

class APIFail():RuntimeException()

class APIForbidden():RuntimeException(

Precondition function

checkNotNull

如果參數是null,拋出IllegalStateException異常,否則回傳參數值

require

如果參數是false,拋出IllegalArgumentException異常

requireNotNull

如果參數是null,拋出IllegalStateException異常,否則回傳參數值

error

拋出異常訊息

assert

如果參數是false,拋出AssertionError異常

deck

By evanchen76

deck

  • 348