{"record":{"id":"550f28d7074e8d7e","repo":"Tencent/matrix","slug":"config-delaymillis-is-empty","errorCode":null,"errorMessage":"config.delayMillis is empty","messagePattern":"config\\.delayMillis is empty","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"matrix/matrix-android/matrix-memory-canary/src/main/java/com/tencent/matrix/memory/canary/trim/TrimMemoryNotifier.kt","lineNumber":127,"sourceCode":"            if (nextIndex < config.delayMillis.size) {\n                delayIndex = nextIndex\n                val delay = config.delayMillis[nextIndex]\n                runningHandler.postDelayed(this, delay)\n                MatrixLog.i(\n                    TAG,\n                    \"...[$name] trim delay[${nextIndex + 1}/${config.delayMillis.size}] $delay\"\n                )\n            }\n        }\n    }\n\n    fun init(config: TrimMemoryConfig) {\n        if (!config.enable) {\n            return\n        }\n\n        if (config.delayMillis.isEmpty()) {\n            throw IllegalArgumentException(\"config.delayMillis is empty\")\n        }\n\n        if (!Matrix.isInstalled()) {\n            MatrixLog.e(TAG, \"Matrix NOT installed yet\")\n            return\n        }\n\n        // system trim\n        Matrix.with().application.registerComponentCallbacks(object : ComponentCallbacks2 {\n\n            private var lastTrimTimeMillis = 0L\n\n            @Volatile\n            private var trimCounter = 0\n            private val maxTrimCount = 10\n\n            init {\n                ProcessExplicitBackgroundOwner.addLifecycleCallback(object :","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/Tencent/matrix/blob/3b8293bd65d47eeea7caf1f32a3a5d4d5eab60e7/matrix/matrix-android/matrix-memory-canary/src/main/java/com/tencent/matrix/memory/canary/trim/TrimMemoryNotifier.kt#L109-L145","documentation":"TrimMemoryNotifier.init throws IllegalArgumentException when the supplied TrimMemoryConfig has enable=true but an empty delayMillis list. The notifier schedules trim-memory notifications at each delay in that list, so an empty list makes the component unusable and it fails fast during init.","triggerScenarios":"Constructing a TrimMemoryConfig with enable=true and leaving delayMillis empty (or empty array/list via JSON/dynamic config), then calling TrimMemoryNotifier.init(config).","commonSituations":"Server-driven / dynamic config returning an empty delay array; copying a config template where delayMillis was never filled; type changes turning the list into an empty default.","solutions":["Provide at least one value in delayMillis, e.g. longArrayOf(500, 1000, 3000).","Or set enable=false so init returns early without validation.","Add a default fallback in code: if (config.delayMillis.isEmpty()) use default delays before calling init."],"exampleFix":"// before\nval config = TrimMemoryConfig(enable = true, delayMillis = emptyList())\nTrimMemoryNotifier.init(config)\n// after\nval config = TrimMemoryConfig(enable = true, delayMillis = listOf(500L, 1000L, 3000L))\nTrimMemoryNotifier.init(config)","handlingStrategy":"validation","validationCode":"fun safeInit(raw: TrimMemoryConfig): Boolean {\n  if (!raw.enable) return false\n  if (raw.delayMillis.isNullOrEmpty()) {\n    MatrixLog.e(\"Trim\", \"delayMillis empty; using defaults\")\n    TrimMemoryNotifier.init(TrimMemoryConfig(true, listOf(500L, 1000L, 3000L)))\n    return true\n  }\n  TrimMemoryNotifier.init(raw)\n  return true\n}","typeGuard":"fun isValidTrimConfig(c: TrimMemoryConfig): Boolean = !c.enable || c.delayMillis.isNotEmpty()","tryCatchPattern":"try {\n  TrimMemoryNotifier.init(config)\n} catch (e: IllegalArgumentException) {\n  MatrixLog.e(TAG, \"invalid TrimMemoryConfig: ${e.message}\")\n}","preventionTips":["Validate dynamic/server config before passing it to init.","Provide default delay values whenever enable=true.","Add a unit test asserting init accepts only non-empty delay lists."],"tags":["android","memory","configuration","empty-list"],"backgroundTag":"empty-required-field","analyzedSha":"3b8293bd65d47eeea7caf1f32a3a5d4d5eab60e7","analyzedAt":"2026-09-08T08:01:39.722Z","contentChangedAt":"2026-09-08T08:01:39.722Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}