Caused by: java.lang.IllegalArgumentException: bad base-64

本文介绍如何使用Android的Base64类将Bitmap图片转换为Base64编码的字符串,提供了一种有效的实现方法,并解释了使用Base64进行图片数据编码时常见的错误及其解决方案。

今天做项目,用到android.util.Base64这个类来把byte[]数组转换为 base64-encode的String类型


static String

<nobr></nobr> <nobr><em><span style="color:#6633ff"><span class="sympad"><a>encodeToString</a></span>(byte[] input, int offset, int len, int flags)</span></em></nobr>
Base64-encode the given data and return a newly allocated String with the result.


而这个byte[]我是从一张图片的bitmap转化而来的:

具体转换代码如下:

/**
*
* @file BitmapToBytesUtil.java
* @author Samuel.Cai
* @date Jan 6, 2012
*/
public class BitmapToBytesUtil {
public static byte[] bitmapToBytes(Bitmap bitmap) {
if (bitmap == null) {
return null;
}
final ByteArrayOutputStream os = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
return os.toByteArray();
}
}


一开始使用的是:

new String(Base64.decode(BitmapToBytesUtil.bitmapToBytes(bitmap), Base64.DEFAULT));这样写后,运行程序得到的结果是crash

:


01-06 15:28:09.616: E/AndroidRuntime(776): Caused by: java.lang.IllegalArgumentException: bad base-64
01-06 15:28:09.616: E/AndroidRuntime(776): at android.util.Base64.decode(Base64.java:161)
01-06 15:28:09.616: E/AndroidRuntime(776): at android.util.Base64.decode(Base64.java:136)


解决方法:

换一种写法就ok了:

Base64.encodeToString(BitmapToBytesUtil.bitmapToBytes(bitmap), Base64.DEFAULT)

错误原因:英文太烂,加密与解密分辨不清

: 初始化协议处理器 ["https-jsse-nio-8443"] 6月 28, 2025 3:35:00 下午 org.apache.catalina.util.LifecycleBase handleSubClassException 严重: 初始化组件[Connector[HTTP/1.1-8443]]失败。 org.apache.catalina.LifecycleException: 协议处理程序初始化失败 at org.apache.catalina.connector.Connector.initInternal(Connector.java:1049) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardService.initInternal(StandardService.java:556) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1045) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.startup.Catalina.load(Catalina.java:724) at org.apache.catalina.startup.Catalina.load(Catalina.java:746) 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.apache.catalina.startup.Bootstrap.load(Bootstrap.java:302) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:472) Caused by: java.lang.IllegalArgumentException: keystore password was incorrect at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99) at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71) at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:258) at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1204) at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1217) at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:603) at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:80) at org.apache.catalina.connector.Connector.initInternal(Connector.java:1046) ... 13 more Caused by: java.io.IOException: keystore password was incorrect at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2159) at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:242) at java.base/java.security.KeyStore.load(KeyStore.java:1473) at org.apache.tomcat.util.security.KeyStoreUtil.load(KeyStoreUtil.java:69) at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:216) at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:207) at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:282) at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:246) at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97) ... 20 more Caused by: java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption. ... 29 more 6月 28, 2025 3:35:00 下午 org.apache.catalina.startup.Catalina load
06-29
<think>我们正在处理一个关于JavaIllegalArgumentException错误的问题,特别是与错误代码-10相关的情况。根据用户提供的引用,我们注意到引用[1]提到了Jersey框架中repackaged ASM库,并且在ClassReader构造函数中抛出了IllegalArgumentException。引用[2]和[3]是关于编码规范和equals方法覆盖的,与当前问题关联不大。 用户的问题:查找JavaIllegalArgumentException错误的原因和解决方法,特别是与错误代码-10相关的具体情况。 分析: 1. IllegalArgumentExceptionJava中的一个运行时异常,通常表示向方法传递了一个不合法或不正确的参数。 2. 错误代码-10并不是Java标准异常的一部分,它可能是特定框架或应用程序自定义的错误代码。在引用[1]中,Jersey框架(一个RESTful Web服务框架)使用了ASM库(一个Java字节码操作框架)的ClassReader,并在构造时可能抛出IllegalArgumentException。错误代码-10可能是在这个上下文中出现的。 根据引用[1]的信息,我们可以推测在Jersey框架中,当使用ClassReader读取类文件时,如果类文件不符合预期,可能会抛出IllegalArgumentException,并且可能附带一个错误代码(如-10)。但需要明确的是,Java标准异常中并没有错误代码,所以这个-10很可能是Jersey或ASM库自定义的。 因此,我们需要针对Jersey框架中ASM库的ClassReader可能抛出IllegalArgumentException的原因进行排查。 可能的原因: 1. 类文件版本不兼容:ASM库的ClassReader可能无法解析高于其支持版本的类文件。 2. 损坏的类文件:类文件可能损坏或不完整。 3. 类路径问题:类文件找不到或加载了错误的类文件。 4. 框架内部错误:Jersey或ASM库的bug。 解决方案: 1. 检查类文件版本:确保你使用的Jersey版本所依赖的ASM库能够支持你项目中类文件的版本。例如,如果你使用了Java 11的新特性,但Jersey版本较旧(如2.25.1),其内置的ASM版本可能不支持。解决办法是升级Jersey版本或显式升级ASM库(注意Jersey repackaged了ASM,所以可能需要使用Jersey提供的ASM版本)。 2. 检查类文件:确认类文件是否完整。可以尝试反编译类文件查看是否有异常。 3. 检查类路径:确保所有需要的类都在类路径中,并且没有冲突的版本。 4. 查看详细错误信息:IllegalArgumentException通常会带有详细的消息,从中可以获取更多线索。例如,在引用[1]中,用户通过查看ClassReader的构造函数找到了抛出异常的位置,我们可以根据异常消息进一步判断。 5. 升级框架:如果可能,升级到最新的Jersey版本,因为新版本可能已经修复了该问题。 6. 调试代码:在本地调试,捕获异常时的堆栈信息,查看是在哪个类的哪个方法中抛出的,以及传递了什么参数导致异常。 由于用户提到错误代码-10,我们可以假设这是ASM库中特定的错误代码。查阅ASM库的文档或源码,我们可以找到错误代码-10的含义。在ASM库中,错误代码通常与特定的解析错误相关。例如,在ASM的ClassReader中,-10可能表示“不合法的常量池索引”或其他解析错误。 但是,由于ASM库的错误代码并没有公开的标准文档,我们需要查看其源码。在ASM的源码中,我们可以找到ClassReader的构造函数,其中会抛出IllegalArgumentException,并附带错误消息,消息中可能包含错误代码。 由于我们无法直接查看用户环境中的源码,我们可以根据经验推测:错误代码-10可能对应于常量池解析错误。例如,常量池索引超出范围、无效的常量池标签等。 因此,建议用户: - 使用字节码查看工具(如javap)检查相关类文件的常量池是否正常。 - 检查是否有不同版本的ASM库冲突。例如,项目中可能引入了不同版本的ASM,而Jersey repackaged的ASM与其他库引入的ASM冲突。 具体步骤: 步骤1:检查异常堆栈 查看完整的异常堆栈,确定抛出异常的类和方法。如果异常来自org.objectweb.asm.ClassReader,那么就是ASM解析类文件时出错。 步骤2:检查类文件 找到导致解析失败的类文件。通常,异常消息中会包含类名。使用javap反编译这个类文件,检查其字节码是否合法。 步骤3:排除依赖冲突 使用Maven的依赖树分析(mvn dependency:tree)或Gradle的依赖报告,检查ASM库的版本。确保所有模块使用相同的ASM版本(注意Jersey repackaged的ASM,其包名可能是org.glassfish.jersey.internal.org.objectweb.asm)。如果存在冲突,需要排除其他依赖引入的ASM,或者统一版本。 步骤4:升级Jersey 如果使用较旧的Jersey版本,尝试升级到最新稳定版,因为新版本可能包含ASM的更新,支持更高版本的Java类文件。 步骤5:自定义ClassReader 如果以上方法无效,可以考虑自定义ClassReader,通过覆盖某些方法避免解析错误(这需要深入ASM知识,通常不推荐)。 示例代码:捕获IllegalArgumentException并打印详细信息 ```java try { // 你的代码,例如使用ClassReader ClassReader reader = new ClassReader(className); } catch (IllegalArgumentException e) { // 打印详细错误信息 e.printStackTrace(); // 这里可以记录日志,包括错误代码(如果消息中包含) } ``` 由于用户没有提供具体的异常消息,以上是通用的解决方案。如果用户能提供具体的异常堆栈和错误消息,可以进一步分析。 相关问题: 1. Jersey框架中如何解决类文件版本不兼容的问题? 2. 如何排查Java字节码库ASM的解析错误? 3.Java项目中如何排除冲突的ASM依赖?</think>### Java 中 `IllegalArgumentException` 错误代码 -10 的原因与解决方案 `IllegalArgumentException` 是 Java 中常见的运行时异常,表示向方法传递了非法或不适当的参数。结合错误代码 **-10** 和您提供的引用信息,以下是具体分析和解决方案: --- ### 一、错误代码 -10 的常见原因(基于引用分析) 1. **ASM 字节码操作异常**(引用[1]) - Jersey 框架(如 2.25.1 版本)内置了 repackaged ASM 库,用于字节码操作。 - 当 `ClassReader` 解析无效的类文件时(如损坏的 `.class` 文件或版本不兼容),会抛出 `IllegalArgumentException` 并可能伴随错误代码 -10。 - **触发场景**: ```java ClassReader reader = new ClassReader(input); // 可能抛出异常[^1] ``` 2. **接口或类定义违规**(引用[2]) - 在接口中定义非常量变量或添加 `public` 修饰符会导致字节码生成异常。 - **错误示例**: ```java public interface MyInterface { public void method(); // 违反规范[^2] int variable = 10; // 允许(常量) } ``` 3. **equals() 方法覆盖不当**(引用[3]) - 子类错误覆盖 `equals()` 方法(如未调用 `super.equals()`)可能导致对象比较时参数校验失败。 --- ### 二、针对性解决方案 #### 步骤 1:验证类文件完整性 - **检查依赖的类文件**: - 使用字节码查看工具(如 `javap`)验证类文件是否损坏: ```bash javap -verbose YourClassName.class ``` - 确认类文件版本与 JVM 兼容(如 Java 8 的类文件在 Java 17 上可能需 `--release` 参数)。 - **更新依赖库**: - 升级 Jersey 到最新版本(如 3.x),修复 ASM 兼容性问题: ```xml <!-- Maven 示例 --> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>3.1.2</version> <!-- 较新版本 --> </dependency> ``` #### 步骤 2:修复代码规范问题 - **接口定义合规**: ```java public interface MyInterface { void method(); // 移除 public 修饰符[^2] String CONSTANT = "VALUE"; // 仅允许常量 } ``` - **正确覆盖 equals()**: ```java @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof MyClass)) return false; if (!super.equals(o)) return false; // 调用超类 equals[^3] MyClass other = (MyClass) o; return Objects.equals(this.field, other.field); } ``` #### 步骤 3:调试 ASM 相关操作 - 捕获异常堆栈定位问题类: ```java try { ClassReader reader = new ClassReader(bytecode); } catch (IllegalArgumentException e) { e.printStackTrace(); // 查看触发异常的类名 } ``` - 若问题在第三方库,通过 **Maven 依赖树**排查 ASM 冲突: ```bash mvn dependency:tree | grep asm ``` 排除冲突版本: ```xml <dependency> <groupId>com.example</groupId> <artifactId>problematic-lib</artifactId> <exclusions> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> </exclusions> </dependency> ``` #### 步骤 4:预防措施 1. **启用详细日志**: 在 JVM 参数中添加 `-Djersey.logging.level=FINE` 输出 ASM 操作细节。 2. **单元测试覆盖**: 使用 JUnit 测试边界参数: ```java @Test(expected = IllegalArgumentException.class) public void testInvalidInput() { yourMethod(null); // 触发异常的场景 } ``` --- ### 三、错误代码 -10 的典型场景总结 | 场景 | 根本原因 | 解决方案 | |---------------------|-----------------------------|------------------------------| | 字节码解析失败 | 类文件损坏或版本不兼容 | 更新库版本,验证类文件完整性 | | 接口/类定义违规 | 非常量变量或冗余修饰符 | 遵守 Java 编码规范 [^2] | | equals() 覆盖错误 | 未正确处理超类比较逻辑 | 调用 `super.equals()` [^3] | | 依赖冲突 | 多版本 ASM 库共存 | 排除冲突依赖 | > **关键提示**:错误代码 -10 通常是框架/库自定义的扩展错误码,需结合具体堆栈信息定位。建议优先检查 **ASM 操作**和 **equals() 逻辑**,这两者在引用中出现频率最高。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值