Kotlin_String/ Array笔记

Kotlin正则表达式与Array操作
本文介绍如何在Kotlin中使用正则表达式处理字符串,将其转换为Array,并实现查找与添加新字符串的功能。同时,展示了如何从Array中删除指定字符串的方法。

Kotlin  String 可以使用正则表达式过滤内容(split), 并且转成Array (toTypedArray), 如下:

val arrays = stringList.split(";".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()

由Array 可以完成查找功能(Arrays.stream(XX).anyMatch),

val found = Arrays.stream(arrays).anyMatch { t -> t == newValue }

例如可以实现从以分号(l;) 区分的一串字符中, 查找有没特定的字符串,如果没有,则把当前查找的字符串添加进去,

测试代码如下:

class ArrayTest {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            val stringList = "2313;133434;1232321;1232312;1232312;43432432;342342;2343123;2343241;64564"


            println("stringList = $stringList")
            // 以; 过滤并转成Array
            val arrays = stringList.split(";".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()


            println("arrays println ======================start ================")
            arrays.forEach { print("$it ") }
            println()
            println("arrays println ======================end ================")

           addNewString(arrays, stringList)
            //removeString(arrays, stringList)
        }
        
        @JvmStatic
        private fun addNewString(arrays: Array<String>, stringList: String) {
            var newValue = "88888"
            println("newValue = $newValue")
            // 从Array 中确认有没需要查找的子串
            val found = Arrays.stream(arrays).anyMatch { t -> t == newValue }
            var newList = StringBuilder()
            // 没有找到则添加进去
            if (!found) {
                newList = StringBuilder(stringList).append(';').append(newValue)
            }
            println("newList = $newList")
        }
}

输出:

stringList = 2313;133434;1232321;1232312;1232312;43432432;342342;2343123;2343241;64564
arrays println ======================start ================
2313 133434 1232321 1232312 1232312 43432432 342342 2343123 2343241 64564 
arrays println ======================end ================
newValue = 88888
newList = 2313;133434;1232321;1232312;1232312;43432432;342342;2343123;2343241;64564;88888

 

同样,也可以实现查找后删除,如

        @JvmStatic
        private fun removeString(arrays: Array<String>, stringList: String) {
            var removeString = "2313"
            println("removeValue = $removeString")
            // 从Array 中确认有没需要查找的子串

            var newList = StringBuilder()
            // 没有找到则添加进去
            for (checkSubString in arrays) {
                if (removeString != checkSubString) {
                    if (newList.isEmpty()) {
                        newList.append(checkSubString)
                    } else {
                        newList.append(';').append(checkSubString)
                    }
                }
            }
            println("newList = $newList")

        }

输出为(删除第一个):

stringList = 2313;133434;1232321;1232312;1232312;43432432;342342;2343123;2343241;64564
arrays println ======================start ================
2313 133434 1232321 1232312 1232312 43432432 342342 2343123 2343241 64564 
arrays println ======================end ================
removeValue = 2313
newList = 133434;1232321;1232312;1232312;43432432;342342;2343123;2343241;64564

 

[ 95% 474/495] //frameworks/base/services/permission:services.permission kotlinc [common] FAILED: out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlin/services.permission.jar out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlin_headers/services.permission.jar rm -rf "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/classes" "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/header_classes" "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/srcJars" "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc-build.xml" "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/empty" && mkdir -p "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/classes" "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/header_classes" "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/srcJars" "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/empty" && out_system/host/linux-x86/bin/zipsync -d out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/srcJars -l out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/srcJars/list -f "*.java" out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kapt/kapt-sources.jar && out_system/host/linux-x86/bin/gen-kotlin-build-file --classpath "out_system/soong/.intermediates/build/soong/java/core-libraries/stable.core.platform.api.stubs/android_common/turbine-combined/stable.core.platform.api.stubs.jar:out_system/soong/.intermediates/libcore/core-lambda-stubs/android_common/turbine-combined/core-lambda-stubs.jar:out_system/soong/.intermediates/frameworks/base/ext/android_common/turbine-combined/ext.jar:out_system/soong/.intermediates/frameworks/base/framework/android_common/turbine-combined/framework.jar:out_system/soong/.intermediates/frameworks/base/services/core/services.core/android_common/turbine-combined/services.core.jar:out_system/soong/.intermediates/external/kotlinc/kotlin-annotations/android_common/combined/kotlin-annotations.jar:out_system/soong/.intermediates/external/kotlinc/kotlin-stdlib/android_common/combined/kotlin-stdlib.jar:out_system/soong/.intermediates/external/kotlinc/kotlin-stdlib-jdk7/android_common/combined/kotlin-stdlib-jdk7.jar" --name "frameworks__base__services__permission__android_common__services.permission" --out_dir "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/classes" --srcs "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlin/services.permission.jar.rsp" --srcs "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/srcJars/list" --out "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc-build.xml" && external/kotlinc/bin/kotlinc -Didea.plugins.compatible.build=999.SNAPSHOT -J--add-opens=java.base/java.util=ALL-UNNAMED -J-Xmx4096M -Xjvm-default=all -Xno-call-assertions -Xno-param-assertions -Xno-receiver-assertions -Xsam-conversions=class -no-stdlib -no-jdk -jvm-target 17 -Xbuild-file=out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc-build.xml -kotlin-home out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/empty -Xplugin=external/kotlinc/lib/jvm-abi-gen.jar -P plugin:org.jetbrains.kotlin.jvm.abi:outputDir=out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/header_classes && out_system/host/linux-x86/bin/soong_zip -jar -o out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlin/services.permission.jar -C out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/classes -D out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/classes -write_if_changed && out_system/host/linux-x86/bin/soong_zip -jar -o out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlin_headers/services.permission.jar -C out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/header_classes -D out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/header_classes -write_if_changed && rm -rf "out_system/soong/.intermediates/frameworks/base/services/permission/services.permission/android_common/kotlinc/srcJars" exception: org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering File being compiled: /home/user256/work/TVE1086/system/frameworks/base/services/permission/java/com/android/server/permission/access/AccessCheckingService.kt The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:49) at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException(CodegenUtil.kt:241) at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException$default(CodegenUtil.kt:236) at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invokeSequential(performByIrFile.kt:68) at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:55) at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:41) at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:96) at org.jetbrains.kotlin.backend.common.phaser.CompositePhase.invoke(PhaseBuilders.kt:29) at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:96) at org.jetbrains.kotlin.backend.common.phaser.CompilerPhaseKt.invokeToplevel(CompilerPhase.kt:43) at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.invokeCodegen(JvmIrCodegenFactory.kt:312) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.runCodegen(KotlinToJVMBytecodeCompiler.kt:348) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:123) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:47) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:167) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:53) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:101) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:47) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:79) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:43) at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit(CLITool.kt:179) at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit$default(CLITool.kt:177) at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMain(CLITool.kt:166) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler$Companion.main(K2JVMCompiler.kt:250) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.main(K2JVMCompiler.kt) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.jetbrains.kotlin.preloading.Preloader.run(Preloader.java:87) at org.jetbrains.kotlin.preloading.Preloader.main(Preloader.java:44) Caused by: java.lang.RuntimeException: Exception while generating code for: FUN name:initialize visibility:public modality:FINAL <> ($this:com.android.server.permission.access.AccessCheckingService) returnType:kotlin.Unit $this: VALUE_PARAMETER name:<this> type:com.android.server.permission.access.AccessCheckingService这个报错是什么原因怎么修复
最新发布
08-09
<think>嗯,用户遇到了一个Kotlin编译错误"Backend Internal error: Exception during IR lowering",这是在编译Android系统源码时出现的。这个问题看起来和Kotlin编译器的内部中间表示(IR)处理有关。 用户可能正在使用IDEA或Android Studio开发Android应用,遇到了这个棘手的编译错误。从错误信息看,这属于Kotlin编译器后端的内部异常,通常比较难直接定位原因。用户应该已经尝试过基本的清理和重建操作但未能解决,所以需要更深入的排查方案。 让我梳理几个关键排查方向: 首先是环境配置问题,特别是Gradle JDK版本。引用[3]提到需要JDK 11+,这很关键,因为Kotlin编译器对JDK版本很敏感。其次是Kotlin版本兼容性,引用[2]指出compose编译器版本需要匹配,这个在Android开发中经常被忽略。另外缓存问题也值得关注,因为不完整的缓存可能导致IR处理异常。 用户可能没意识到的是,这个错误有时是由依赖冲突引起的。比如当不同模块使用不同版本的Kotlin stdlib时,编译器在生成中间代码阶段就会崩溃。还有资源文件错误也可能间接导致IR处理失败,比如XML里包含非法字符。 考虑到这是系统源码编译,建议用户先尝试最稳妥的clean build操作,这能解决50%以上的非常规编译问题。如果无效,就要重点检查JDK版本和Gradle配置,特别是local.properties里的JAVA_HOME设置。升级Kotlin版本也是常用手段,但要注意同步更新所有相关插件。 对于高级用户,启用编译日志和堆栈跟踪能提供关键线索。不过要提醒用户,--stacktrace输出的信息可能很专业,需要一定经验才能解读。如果所有常规方法都失败,可能需要考虑降级Kotlin版本这种回退方案。</think>以下是针对Kotlin编译错误 `Backend Internal error: Exception during IR lowering` 的完整修复方案,结合常见原因和系统级编译场景: --- ### **原因分析与修复步骤** #### 📌 1. **检查Gradle JDK版本** - **问题根源**:Kotlin编译器需要 **JDK 11+** 支持(尤其Android Gradle Plugin 7.0+)[^3] - **操作步骤**: 1. 打开 `File > Project Structure > SDK Location` 2. 确认 **JDK Location** 指向 **JDK 11+** 3. 在终端执行: ```bash ./gradlew -v # 检查Gradle JVM版本 ``` 4. 若需修改全局配置: `File > Settings > Build Tools > Gradle` → 修改 **Gradle JDK** 为JDK 11+ #### 📌 2. **清理构建缓存** Kotlin IR编译器可能因缓存损坏报错: ```bash # 清理项目缓存 ./gradlew cleanBuildCache rm -rf ~/.gradle/caches/build-cache-* # 清理Kotlin特定缓存 rm -rf build/ kotlin-build/ ``` #### 📌 3. **同步Kotlin与Compose版本** - **关键依赖冲突**:`kotlin-gradle-plugin` 与 `compose-compiler` 版本必须兼容[^2] - 在 `build.gradle` 中显式声明版本: ```gradle buildscript { ext.kotlin_version = "1.9.0" // 需≥1.8.20 dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } android { composeOptions { kotlinCompilerExtensionVersion = "1.5.3" // 必须匹配Kotlin版本 } } ``` - 参考[官方兼容表](https://developer.android.com/jetpack/androidx/releases/compose-kotlin)调整版本 #### 📌 4. **检查增量编译问题** 临时禁用增量编译以验证: ```gradle // gradle.properties kotlin.incremental=false kapt.incremental.apt=false ``` #### 📌 5. **排查资源文件错误** Kotlin IR可能因资源文件异常崩溃: - 检查 `res/` 目录下的XML文件是否有语法错误 - 验证资源命名是否包含非法字符(如 `@+id/foo.bar`) #### 📌 6. **启用详细日志** 获取完整错误堆栈: ```bash ./gradlew assembleDebug --stacktrace --info ``` 重点关注 **"Caused by"** 后的堆栈信息,常见诱因: - 泛型类型推断失败 - 内联函数递归调用 - 实验性API未启用 --- ### **高级修复方案** #### 🔧 1. **升级Kotlin到稳定版** ```gradle // build.gradle ext.kotlin_version = '1.9.22' // 当前最新稳定版 ``` #### 🔧 2. **强制依赖版本统一** 解决传递依赖冲突: ```gradle configurations.all { resolutionStrategy { force 'org.jetbrains.kotlin:kotlin-stdlib:1.9.22' force 'org.jetbrains.kotlin:kotlin-reflect:1.9.22' } } ``` #### 🔧 3. **禁用IR编译器(临时方案)** 在 `gradle.properties` 中回退旧编译器: ```properties kotlin.use.ir.backend=false # 回退至旧版前端编译器 ``` > ⚠️ 此方案仅作临时验证,Compose项目需保持IR开启 --- ### **系统源码编译特殊处理** 针对AOSP项目: 1. 在 `prebuilts/kotlin/` 中检查预置Kotlin版本 2. 更新repo中的Kotlin工具链: ```bash repo sync prebuilts/kotlin ``` 3. 确认环境变量 `JAVA_HOME` 指向JDK 11: ```bash export JAVA_HOME=/path/to/jdk11 ``` --- ### **典型错误案例参考** ```log Caused by: java.lang.IllegalStateException: at org.jetbrains.kotlin.ir.util.TransformersKt.transform(Transformers.kt:33) at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.generateModule(JvmIrCodegenFactory.kt:91) ``` 👉 **解决方案**:升级Kotlin至 **1.8.20+** 修复IR转换器缺陷[^1] --- > **结果验证**:完成上述步骤后执行: > ```bash > ./gradlew clean && ./gradlew assembleDebug > ``` > 若问题仍存,请提供 `--stacktrace` 输出中的 **首个"Caused by"** 堆栈信息进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值