簡體   English   中英

如何在 Kotlin 中正確使用字符串屬性?

[英]How to use string property correctly in Kotlin?

我有以下代碼將根據 EditText 中字符串的前五個字符調用函數 save()。 如果滿足條件,我要保存到數據庫的內容是編輯文本中前五個字符之后的任何內容。

當編輯文本中的字符串超過五個字符時,下面的代碼工作正常。 如果字符串的長度小於 5,則應用程序崩潰。 為了避免這種情況,我添加了第二個代碼塊來查找字符串的長度,但它不起作用。 你能檢查一下問題出在哪里嗎?

 val pass =findViewById<EditText>(R.id.editText).text.toString()
            var password: String = pass.substring(0,5)

            if (password == "hello"){
                save()
                Toast.makeText(this, "Database updated", Toast.LENGTH_LONG).show()
            }
            else
            {
                Toast.makeText(this, "Unauthorized user", Toast.LENGTH_LONG).show()
            }

        }

我在 REPL 中嘗試了以下代碼,它返回了以下幾行或錯誤。

java.lang.StringIndexOutOfBoundsException: String index out of range: 3 at java.lang.String.substring(String.java:1963)

var pass="gl"
var password = pass.substring(0,3)
val len = password.length
println(len)
print(password)

當變量 pass 的長度等於或大於 3 個字符時,它會在 REPL 中正確執行。

我在使用 Kotlin 的 Android Studio 上。

注意:第二塊代碼,按原樣,不是寫入編輯器的內容。 這是我在 REPL 中嘗試的示例。

首先檢查字符串的長度,然后根據長度的大小進行工作,例如

val length = pass.length
if(length<5){
    println(len);
}else{
   var password: String = pass.substring(0,5)

        if (password == "hello"){
            save()
            Toast.makeText(this, "Database updated", Toast.LENGTH_LONG).show()
        }
        else
        {
            Toast.makeText(this, "Unauthorized user", Toast.LENGTH_LONG).show()
        }
}

在 Java/Kotlin 中,一個 String 是一個字符序列,每個字符都有一個給定的索引,索引從 0 開始,例如:

"Hello"

length: 5 (5 characters)
startIndex: 0
endIndex: length - 1 = 5 - 1 = 4

Character    Index
    H          0
    e          1
    l          2
    l          3
    o          4

來自子字符串Kotlin 文檔:

返回此字符串的子字符串,從 startIndex 開始並在 endIndex 之前結束。

 fun String.substring(startIndex: Int, endIndex: Int): String

回到你的例子:

"gl"

length: 2
startIndex: 0
endIndex: length - 1 = 2 - 1 = 1

Character    Index
    g          0
    l          1

pass.substring(0,3)將在 startIndex (0) 處返回一個子字符串,並在 endIndex (endIndex - 1 = 3 - 1 = 2) 之前結束。 但是 2 是無效索引,因此程序會拋出IndexOutOfBoundsException並使您的應用程序崩潰。

您可以在調用substring()之前檢查 editText 的長度。

// Define this variable in scope of class
private val PASSWORD_LENGTH_MIN = 5


val pass = findViewById<EditText>(R.id.editText).text.toString()

if (pass.length < PASSWORD_LENGTH_MIN) {
    Toast.makeText(this, "Password length too short.", Toast.LENGTH_LONG).show()
} else {
    var password: String = pass.substring(0, PASSWORD_LENGTH_MIN)

    if (password == "hello") {
        save()
        Toast.makeText(this, "Database updated", Toast.LENGTH_LONG).show()
    } else {
        Toast.makeText(this, "Unauthorized user", Toast.LENGTH_LONG).show()
    }
}

在您的 save() 函數中輸入以下代碼以檢查字符串的長度是否超過 5 個字符

val pass =findViewById<EditText>(R.id.editText).text.toString()

if (pass.length>5){
     var password: String = pass.substring(0,5)
          if (password == "hello"){
                save()
                Toast.makeText(this, "Database updated", Toast.LENGTH_LONG).show()
            }
            else
            {
                Toast.makeText(this, "Unauthorized user", Toast.LENGTH_LONG).show()
            }
}else{
                Toast.makeText(this, "Length is less than 5 Chars", Toast.LENGTH_LONG).show()

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM