You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Kotlin实现AES加密时应用崩溃求助

问题分析与解决方案

你遇到的崩溃核心原因是控件初始化时机错误,同时代码还存在语法笔误、AES密钥不符合规范等问题,以下是逐一修复方案:

1. 修复启动时的空指针崩溃

你在类成员变量位置直接调用findViewById,此时Activity还未执行setContentView加载布局,所有控件都会返回null,导致App启动即崩溃。必须将控件初始化放在setContentView之后。

2. 修正其他关键问题

  • 语法笔误:原代码中va clave是拼写错误,需改为val clave
  • AES密钥规范:AES要求密钥长度必须为128位(16字节)、192位(24字节)或256位(32字节),原密钥长度不符合要求,会抛出无效密钥异常
  • 加密结果显示:加密后的字节数组包含不可打印字符,直接转字符串会乱码,需用Base64编码后再显示
  • Cipher实例化规范:避免依赖平台默认的加密模式和填充,明确指定模式(如AES/ECB/PKCS5Padding)
  • 异常调试:除Toast外,添加日志打印便于排查问题

修复后的完整代码

package com.example.FirstApp

import android.annotation.SuppressLint
import android.util.Base64
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import javax.crypto.Cipher
import javax.crypto.SecretKey
import javax.crypto.spec.SecretKeySpec

class MainActivity : AppCompatActivity() {
    // 仅声明控件变量,不提前初始化
    private lateinit var btnEncriptar: Button
    private lateinit var txtPlano: EditText
    private lateinit var txtEncriptado: EditText
    private var textoEncriptar: String = ""

    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 布局加载完成后初始化控件
        btnEncriptar = findViewById(R.id.btnEncriptar)
        txtPlano = findViewById(R.id.txtPlain)
        txtEncriptado = findViewById(R.id.txtEncriptado)

        btnEncriptar.setOnClickListener{
            textoEncriptar = txtPlano.text.toString()
            encriptar(textoEncriptar)
        }
    }

    private fun encriptar(textoEncriptar: String){
        try {
            // 修正为16字节(128位)的AES密钥
            val claveUsuario: String = "11AA22B4444ABCDEF"
            val clave: SecretKey = SecretKeySpec(claveUsuario.toByteArray(), "AES")
            // 明确指定加密模式和填充方式
            val cifrar: Cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
            cifrar.init(Cipher.ENCRYPT_MODE, clave)
            
            val arrayTextoPlano: ByteArray = textoEncriptar.toByteArray()
            val arrayTextoEncriptado: ByteArray = cifrar.doFinal(arrayTextoPlano)
            
            // 将加密字节数组转为Base64字符串显示
            txtEncriptado.setText(Base64.encodeToString(arrayTextoEncriptado, Base64.DEFAULT))
        } catch (e: Exception){
            Toast.makeText(this, "错误:${e.message}", Toast.LENGTH_LONG).show()
            // 打印异常日志到Logcat,方便调试
            e.printStackTrace()
        }
    }
}

关于Toast未显示的说明

原崩溃发生在App启动阶段(控件初始化时的空指针),此时try-catch块还未被执行,因此Toast没有机会弹出。修复控件初始化问题后,后续的异常就能被正常捕获并显示。

内容的提问来源于stack exchange,提问作者Looking for a answer ...

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:34:53