Kotlin之do while和AssetsUtil

本文介绍如何用Kotlin语言在Android项目中读取Assets文件夹内的JSON文件,并对比了Java与Kotlin的不同实现方式。

最近在用kotlin练习写一个Android项目,记录中途遇到的一些问题

一,android中的AssetsUtil

        public static String getJson(Context context, String fileName){
            StringBuilder stringBuilder = new StringBuilder();
            //获得assets资源管理器
            AssetManager assetManager = context.getAssets();
            //使用IO流读取json文件内容
            try {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
                        assetManager.open(fileName),"utf-8"));
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuilder.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return stringBuilder.toString();
        }

这是平时我们用java来读取android下Assets目录下的json文件的写法

二,Kotlin中的AssetsUtil

因为在用Kotlin写项目,所以需要将以上代码用kotlin实现,自己尝试写了下,发现不好使,然后就直接将上面代码用android-studio转成kotlin 发现报错了。

var line: String = ""
while ((line = bufferedReader.readLine()) != null) {
     stringBuilder.append(line)
}

报错行出现在while里面line = bufferedReader.readLine()这里。异常为:Assignments are not expressions, and only expressions are allowed in this context

是因为在kotlin中的while不允许这么写,它会将他认为是一个表达式,而这里不允许这么写表达式。所以就想到了kotlin中的do-while ,下面是kotlin写法

object AssetsUtil {
    fun getFormAssets(context: Context, fileName: String): String? {
        val stringBuilder = StringBuilder()
        BufferedReader(InputStreamReader(context.assets.open(fileName), "UTF-8")).run {
            var line: String? = ""
            do {
                line = readLine()
                if (line != null) {
                    stringBuilder.append(line)
                } else {
                    break
                    close()
                }
            } while (true)
            return stringBuilder.toString()
        }
        return null
    }
}

测试过,以上代码可用。

三,kotlin中的 do while

其实kotlin中的 while 和 do while和Java中的用法是一样的。这里主要是想强调一下 在使用while的三个关键字

Kotlin有三种结构化跳转表达式:

  • return。默认从最直接包围他的函数或者匿名函数返回(return@this也支持从指定位置返回)
  • break。终止最直接包围它的循环
  • continue。继续下一次最直接包围它的循环。

kotlin之Android项目实战

项目代码:https://github.com/wangxp423/WanAndroidKt

<think> 首先,用户查询是关于Kotlin中使用do-while循环时退出循环的方法。我需要基于提供的引用来回答。 回顾引用: - 引用[1]:提到学习Kotlindo...while循环的实现异常循环终止的处理。强调了breakcontinue关键字的使用。 - 引用[2]:详细描述do-while循环语法:先执行一次循环体,然后检查条件。示例显示通过检查输入"exit"来退出循环。 - 引用[3]:介绍Kotlin的整体特点使用场景,但没有特定提到循环退出方法。 - 引用[4]:简要提到whiledo-while循环,但示例是while循环,不是do-while- 引用[5]:显示forwhile循环的使用,但主要是索引遍历,没有具体退出方法。 关键引用是[1][2],它们直接讨论do-while循环退出机制。 系统指令要求: - 使用中文回答。 - 在行内数学表达式使用$...$格式(但这里可能不涉及数学表达式,除非有变量)。 - 独立公式使用$$...$$格式(可能不适用)。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 结构清晰,帮助用户逐步解决问题。 用户查询:我想查找Kotlin中使用do while循环时退出循环的方法。请问Kotlin do while循环退出方法。 所以,我需要解释在Kotlin中如何退出do-while循环。 从引用中提取关键信息: - 正常退出:通过条件不满足。引用[2]示例:当input != "exit"时继续,否则退出。 - 使用break关键字:引用[1]提到“掌握break与continue关键字的使用”,可以更灵活控制循环。 - 异常终止:引用[1]提到“异常循环终止的处理”,但Kotlin中通常使用break而非异常来控制循环退出;异常用于错误处理。 在Kotlin中,退出循环的常用方法: 1. **条件检查**:在do-while循环中,循环体执行后检查条件;如果不满足,退出。 2. **break语句**:在循环体内使用break立即退出循环。 3. **continue语句**:跳过当前迭代的剩余部分,继续下一次迭代(但这不是退出整个循环)。 4. **抛出异常**:在极端情况下,但这不是推荐的控制流方式。 现在,构建回答: - **结构清晰**:逐步解释退出方法。 - **使用中文**。 - **添加引用标识**:当引用来源时。 - **生成相关问题**:在末尾。 回答大纲: 1. **介绍do-while循环**:简要解释其结构(执行一次后检查条件)。 2. **退出方法**: - a. 正常退出:通过条件不满足。 - 例子:引用[2]的例子。 - b. 使用break语句:强制退出。 - 解释:在循环体内使用break来提前退出。 - 例子:添加一个简单的代码示例。 3. **其他注意事项**:如continue的使用(可选)。 4. **总结**。 基于引用[2],示例已给出使用条件检查退出的代码。 引用[1]提到breakcontinue关键词。 所以,我可以扩展。 代码示例:应该使用Kotlin代码块。 系统示例中有代码块格式。 最终输出: - 回答部分:解释退出方法。 - 相关问题部分:生成几个相关问题。 相关问题应该基于主题,如优化、常见错误、对比其他循环等。 相关问题: 1. 如何在Kotlin中使用break退出do-while循环? 2. do-while循环与while循环在退出行为上的区别是什么? 3. Kotlin中处理异常中断循环的最佳实践是什么? 确保回答真实可靠:基于标准Kotlin知识引用。 现在,编写回答。 </think> ### Kotlindo-while循环的退出方法 在Kotlin中,`do...while`循环是一种后测试循环:它首先执行一次循环体,然后在每次迭代结束后检查条件。如果条件为`false`,则退出循环;否则,继续执行下一次迭代。退出循环的方法主要有两种:**通过条件检查正常退出****使用`break`关键字强制退出**。下面我将逐步解释这些方法,并基于站内引用提供代码示例说明。 #### 1. **正常退出:通过条件检查** 在`do...while`循环中,退出循环的最常见方式是让循环条件在检查时结果为`false`。循环执行后,会自动评估条件:如果条件不满足(即`condition`为`false`),则退出循环。这是一种“自然”退出方式,适用于大多数场景。 - **语法结构**: ```kotlin do { // 循环体代码 } while (condition) // 如果condition为false,则退出循环 ``` - **示例代码**(基于引用[2]的输入检测示例): ```kotlin var input = "" do { println("输入'exit'退出:") input = readLine() ?: "" // 读取用户输入 // 如果用户输入"exit",条件input != "exit"将变为false,下次检查时退出循环 } while (input != "exit") println("已退出") ``` 在这个例子中,循环会先执行一次循环体(打印提示并读取输入),然后检查`input != "exit`。当用户输入"exit"时,条件变为`false`,循环退出并打印"已退出"[^2]。 #### 2. **强制退出:使用`break`关键字** 如果需要在循环体内部提前退出(例如,遇到特定错误或条件),可以使用`break`关键字。`break`会立即终止整个循环,无论条件是否满足。这提供了更灵活的控制,尤其在处理异常或复杂逻辑时。 - **语法说明**:在循环体内添加`if`条件判断,当满足某个条件时调用`break`。 - **示例代码**(结合引用[1]的异常终止概念): ```kotlin var counter = 0 do { counter++ println("当前计数: $counter") if (counter >= 3) { println("计数达到3,强制退出") break // 提前退出循环 } // 其他逻辑... } while (counter < 5) // 条件counter < 5原本会让循环执行5次,但break提前中断 println("循环结束") ``` 在这个例子中,即使条件`counter < 5`为`true`,当`counter`达到3时,`break`会强制退出循环。输出将停在"计数达到3,强制退出"。这展示了如何通过`break`实现"异常终止",避免不必要的迭代[^1]。 #### 其他注意事项 - **`continue`关键字**:虽然不是退出整个循环,但`continue`可用于跳过当前迭代的剩余部分,直接进入下一次条件检查。这在某些场景下可优化性能,但不影响整体退出逻辑。 - **与异常处理结合**:在极端情况下(如遇到致命错误),可以用`throw`抛出异常来中断循环(例如,`if (error) throw Exception("错误发生")`),但这通常不推荐作为控制流手段,因为它可能降低代码可读性性能[^1]。 - **最佳实践**:优先使用条件检查进行自然退出,因为它更清晰可预测。仅在需要提前中断时使用`break`。Kotlin的null安全特性(如引用[3]所述)可帮助避免空指针异常,使循环控制更可靠[^3]。 总之,Kotlin的`do...while`循环退出主要依赖条件检查`break`关键字。通过合理设计条件或使用`break`,您可以编写高效且易读的代码。如果您有具体场景(如处理用户输入或错误恢复),我可以提供更针对性的建议。 ### 相关问题 1. 如何在Kotlin中使用`break`退出嵌套循环? 2. Kotlin的`do...while`循环与`while`循环在退出行为上有哪些区别? 3. Kotlin中如何处理循环中的异常以保证安全退出? [^1]: 掌握循环控制:Kotlin中的do...while异常终止。 [^2]: Kotlin 循环语句详解。 [^3]: Kotlin简记。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值