Error处理:Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException.

本文详细介绍了在使用Eclipse运行Android 2.X版本项目时遇到的报错问题及其解决方法,包括调整Eclipse.ini配置、修改.classpath文件、清理并刷新项目等步骤,最终实现项目成功编译和运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



本文转载于:http://blog.youkuaiyun.com/zjlovety/article/details/17026227


导入Eclipse Android2.X项目后运行,提示报错:


Console中提示:


通过clean up,fix project之后问题均不能解决。


网上还看到有人说,是因为Eclipse stack的问题,调整之后可以解决问题;按此提示,eclipse.ini的内容如下:


  1. -startup
  2. plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
  3. --launcher.library
  4. plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
  5. -product
  6. org.eclipse.epp.package.java.product
  7. --launcher.defaultAction
  8. openFile
  9. --launcher.XXMaxPermSize
  10. 512M
  11. -showsplash
  12. org.eclipse.platform
  13. --launcher.XXMaxPermSize
  14. 256m
  15. --launcher.defaultAction
  16. openFile
  17. -vmargs
  18. -Dosgi.requiredJavaVersion=1.5
  19. -Xms512m
  20. -Xmx1024m
  1. -startup  
  2. plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar  
  3. --launcher.library  
  4. plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502  
  5. -product  
  6. org.eclipse.epp.package.java.product  
  7. --launcher.defaultAction  
  8. openFile  
  9. --launcher.XXMaxPermSize  
  10. 512M  
  11. -showsplash  
  12. org.eclipse.platform  
  13. --launcher.XXMaxPermSize  
  14. 256m  
  15. --launcher.defaultAction  
  16. openFile  
  17. -vmargs  
  18. -Dosgi.requiredJavaVersion=1.5  
  19. -Xms512m  
  20. -Xmx1024m  
-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
512M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m

重启eclipse之后,运行,问题依旧。

如何解决?


之前也遇到过代码没有错误,就是编译运行时报错的情况。之前是因为引用第三方jar造成的,引用方式不对造成的,结合目前的状况,

后来goolge上看到:http://code.google.com/p/android/issues/detail?id=20398帖子中的:


  1. Here is differences between old and new:
  2. (old)
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <classpath>
  5. <classpathentry kind="src" path="src"/>
  6. <classpathentry kind="src" path="gen"/>
  7. <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
  8. <classpathentry kind="src" path="andengine_src"/> <!-- NOTICE THIS LINE -->
  9. <classpathentry kind="output" path="bin"/>
  10. </classpath>
  11. (new)
  12. <?xml version="1.0" encoding="UTF-8"?>
  13. <classpath>
  14. <classpathentry kind="src" path="src"/>
  15. <classpathentry kind="src" path="gen"/>
  16. <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
  17. <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> <!-- NOTICE THIS LINE -->
  18. <classpathentry kind="output" path="bin/classes"/>
  19. </classpath>
  20. Also, new .project file does not contain <linkedResources> section
  1. Here is differences between old and new:  
  2.   
  3. (old)  
  4. <?xml version="1.0" encoding="UTF-8"?>  
  5. <classpath>  
  6.     <classpathentry kind="src" path="src"/>  
  7.     <classpathentry kind="src" path="gen"/>  
  8.     <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>  
  9.     <classpathentry kind="src" path="andengine_src"/> <!-- NOTICE THIS LINE -->  
  10.     <classpathentry kind="output" path="bin"/>  
  11. </classpath>  
  12.   
  13. (new)  
  14. <?xml version="1.0" encoding="UTF-8"?>  
  15. <classpath>  
  16.     <classpathentry kind="src" path="src"/>  
  17.     <classpathentry kind="src" path="gen"/>  
  18.     <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>  
  19.     <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>  <!-- NOTICE THIS LINE -->  
  20.     <classpathentry kind="output" path="bin/classes"/>  
  21. </classpath>  
  22.   
  23. Also, new .project file does not contain <linkedResources> section  
Here is differences between old and new:

(old)
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="src" path="gen"/>
	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
	<classpathentry kind="src" path="andengine_src"/> <!-- NOTICE THIS LINE -->
	<classpathentry kind="output" path="bin"/>
</classpath>

(new)
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="src" path="gen"/>
	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>  <!-- NOTICE THIS LINE -->
	<classpathentry kind="output" path="bin/classes"/>
</classpath>

Also, new .project file does not contain <linkedResources> section

认为下面调整引用库的方式比较靠谱。于是根据这个思想进行调整项目的.classpath


我的.classpath文件内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <classpath>
  3. <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
  4. <classpathentry kind="src" path="src"/>
  5. <classpathentry kind="src" path="gen"/>
  6. <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
  7. <classpathentry kind="lib" path="libs/achartengine-1.1.0.jar"/>
  8. <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
  9. <classpathentry kind="output" path="bin/classes"/>
  10. </classpath>
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <classpath>  
  3.     <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>  
  4.     <classpathentry kind="src" path="src"/>  
  5.     <classpathentry kind="src" path="gen"/>  
  6.     <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>  
  7.     <classpathentry kind="lib" path="libs/achartengine-1.1.0.jar"/>  
  8.     <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>  
  9.     <classpathentry kind="output" path="bin/classes"/>  
  10. </classpath>  
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="src" path="gen"/>
	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
	<classpathentry kind="lib" path="libs/achartengine-1.1.0.jar"/>
	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
	<classpathentry kind="output" path="bin/classes"/>
</classpath>

调整之后如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <classpath>
  3. <classpathentry kind="src" path="src"/>
  4. <classpathentry kind="src" path="gen"/>
  5. <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
  6. <classpathentry kind="lib" path="libs/achartengine-1.1.0.jar"/>
  7. <classpathentry kind="output" path="bin/classes"/>
  8. </classpath>
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <classpath>  
  3.     <classpathentry kind="src" path="src"/>  
  4.     <classpathentry kind="src" path="gen"/>  
  5.     <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>  
  6.     <classpathentry kind="lib" path="libs/achartengine-1.1.0.jar"/>  
  7.     <classpathentry kind="output" path="bin/classes"/>  
  8. </classpath>  
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="src" path="gen"/>
	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
	<classpathentry kind="lib" path="libs/achartengine-1.1.0.jar"/>
	<classpathentry kind="output" path="bin/classes"/>
</classpath>

之后Refresh--->>Clean UP--->>运行项目,一切正常,至此问题解决。


----------

备注说明:

对于这个问题,发现在升级SDK Tool到22.3之后,也就是Android 4.4的SDK及工具之后,加载之前老版本的项目都会出现这个问题。

关键是要将.classpath文件中的:

  1. <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
  1. <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>  
	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>

· 去掉,之后clean up整个项目,再重新编译即可。


后续说明(2013年11月20日):

对于这个问题,最近大家可能比较苦恼,我也发现并不是所有的项目都会出现这个问题,对于具体差异和原因有待以后遇到再深入探究吧。

不过遇到这个问题的项目,凡是经过以下方法处理的都能够正常进行编译和运行。

1、找到你的项目


2、点击右键


3、打开Properties属性项


4、选中左边Java Build Path项,并在该选项中打开Libraries选项卡,如上图中,将Android Dependencies项和Android Private Libraries这两项Remove掉。

5、Clean up该项目

6、重新编译运行。

<think>首先,用户的问题是关于Java中的SQLDataException异常:java.sql.SQLDataException: Unsupported conversion from DOUBLE to java.sql.Timestamp。我需要根据系统指令来回答。 系统指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用,但用户提供的引用是关于LONG和DATETIME的,而用户现在问的是DOUBLE。引用[1],[2],[3]是关于LONG to Timestamp,引用[4]是DATETIME to Long,引用[5]是TIMESTAMP to Integer。用户的问题是关于DOUBLE to Timestamp,所以我需要基于一般原理来回答,而不是直接复制这些引用。 用户的需求:解决java.sql.SQLDataException: Unsupported conversion from DOUBLE to java.sql.Timestamp。 关键点: - 这个异常表示在JDBC操作中,尝试将数据库中的DOUBLE类型转换为Java中的java.sql.Timestamp类型时失败。 - 原因通常是类型不匹配:数据库列是DOUBLE类型,但Java代码中期望的是Timestamp。 可能的原因: 1. **映射错误**:在ResultSet获取数据时,使用了错误的方法。例如,调用getTimestamp()方法,但数据库列是DOUBLE类型。 2. **实体类定义错误**:在使用ORM框架如MyBatis时,实体类的字段类型与数据库列类型不匹配。数据库列是DOUBLE,但Java字段是Timestamp。 3. **查询或结果处理错误**:SQL查询可能返回了DOUBLE值,但代码试图将其作为Timestamp处理。 4. **配置问题**:在MyBatis中,如果没有正确配置typeHandler,可能会导致转换失败。 解决方法: - 检查数据库表结构,确认列的实际数据类型。 - 检查Java代码中ResultSet的使用或实体类的字段类型。 - 确保使用正确的get方法,如getDouble()而不是getTimestamp()。 - 如果使用ORM框架,调整实体类字段类型或添加typeHandler。 - 参考引用中的一些建议,如确保实体类有无参构造函数(引用[3]和[5]提到),但这不是直接相关,因为这里是类型转换问题。 用户提供的引用: - [^1], [^2], [^3]: 关于LONG to Timestamp,提到MyBatis中无参构造函数问题。 - [^4]: DATETIME to Long,提示类型不匹配。 - [^5]: TIMESTAMP to Integer,建议添加构造函数。 针对DOUBLE to Timestamp,我需要一般化建议。 回答结构: 1. **解释异常原因**:简要说明异常的含义。 2. **常见原因分析**:列出可能的原因。 3. **解决方法**:提供逐步的解决步骤。 4. **预防措施**:如何避免类似问题。 5. **生成相关问题**:在最后添加相关问题。 使用中文回答。 LaTeX格式:如果有数学表达式,比如讨论数据类型,但这里可能不需要复杂的数学。如果需要,比如在解释类型转换时,可以用行内数学如$double$表示类型。 生成相关问题:基于主题,生成几个相关问题。 参考用户上次的问题:用户提到“我想用户希望了解在Java中将DOUBLE类型转换为java.sql.Timestamp时出现的SQLDataException异常原因,并寻找解决方法。” 所以,直接针对这个。 完整回答: - 开头:直接回应问题。 - 主体:结构清晰,分步骤。 - 结尾:添加引用标识(如果引用站内内容),并生成相关问题。 现在,构建回答。</think>### java.sql.SQLDataException: Unsupported conversion from DOUBLE to java.sql.Timestamp 的解决方法 当在Java应用程序中使用JDBC或ORM框架(如MyBatis)操作数据库时,如果遇到`java.sql.SQLDataException: Unsupported conversion from DOUBLE to java.sql.Timestamp`异常,这表示系统尝试将数据库中的`DOUBLE`类型数据强制转换为Java的`java.sql.Timestamp`类型,但两者类型不兼容。这种错误通常发生在数据查询或结果映射阶段,可能导致应用程序崩溃。下面我将逐步解释原因并提供解决方法,确保回答真实可靠(基于JDBC和ORM框架的通用原理)。 #### 异常原因分析 该异常的根本原因是**类型不匹配**。具体来说: - **数据库列类型为`DOUBLE`**:数据库中存储的是浮点数(例如,数值如`3.14`或科学计数法表示的值)。 - **Java代码期望`Timestamp`**:在ResultSet操作或实体类映射中,代码试图调用`getTimestamp()`方法或将字段定义为`java.sql.Timestamp`类型,但`DOUBLE`无法直接转换为时间戳类型(因为时间戳代表日期和时间,如`2023-10-05 12:00:00`)。 - **常见触发场景**: - 在JDBC中,错误使用`ResultSet.getTimestamp()`方法获取`DOUBLE`列。 - 在MyBatis等ORM框架中,实体类的字段类型声明为`Timestamp`,但数据库列是`DOUBLE`。 - SQL查询返回了`DOUBLE`值,但应用程序逻辑错误地将其视为时间戳。 - 缺少类型处理器(TypeHandler),导致框架无法自动处理转换。 引用[^4]中提到类似问题(DATETIME到Long的转换失败),强调了类型映射的重要性[^4]。引用[^3]和[^5]则指出ORM框架的配置问题(如构造函数缺失),也可能间接引发类型错误[^3][^5]。 #### 解决步骤 以下是系统化的解决方法,按照从简单到复杂的顺序进行。在操作前,请备份代码和数据库。 1. **检查数据库表和查询**: - 确认数据库表的列实际类型:使用SQL命令(如`DESCRIBE table_name;`)检查目标列是否为`DOUBLE`或类似浮点类型(如`FLOAT`)。 - 审查SQL查询:确保查询未错误地将`DOUBLE`列别名为时间戳类型,或未在查询中进行隐式转换。 - 示例:如果查询是`SELECT double_column AS timestamp FROM my_table;`,修改为正确映射或显式转换。 2. **修正Java代码中的类型映射**: - **在纯JDBC中**: - 使用`ResultSet.getDouble()`代替`getTimestamp()`来获取`DOUBLE`列值。 - 示例代码: ```java // 错误方式:导致异常 Timestamp timestamp = resultSet.getTimestamp("double_column"); // 正确方式:先获取为double,再按需转换 double value = resultSet.getDouble("double_column"); // 如果需要,将double转换为其他类型(但Timestamp需额外逻辑) ``` - **在ORM框架中(如MyBatis)**: - 检查实体类字段类型:确保字段类型与数据库列一致。如果数据库是`DOUBLE`,Java字段应为`double`或`Double`。 - 错误示例:`private Timestamp doubleColumn;` - 正确示例:`private Double doubleColumn;` - 添加或更新TypeHandler:如果必须将`DOUBLE`转换为时间戳(例如,列存储的是时间戳的毫秒数),自定义TypeHandler来处理转换。 - 创建自定义TypeHandler: ```java public class DoubleToTimestampTypeHandler extends BaseTypeHandler<Timestamp> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Timestamp parameter, JdbcType jdbcType) throws SQLException { ps.setDouble(i, parameter.getTime()); // 将Timestamp转为double毫秒值 } @Override public Timestamp getNullableResult(ResultSet rs, String columnName) throws SQLException { double value = rs.getDouble(columnName); return new Timestamp((long) value); // 将double转为Timestamp } } ``` - 在MyBatis配置中注册: ```xml <typeHandlers> <typeHandler handler="com.example.DoubleToTimestampTypeHandler" /> </typeHandlers> ``` - 确保实体类有无参构造函数:引用[^3]和[^5]强调,MyBatis需要无参构造器来反射创建对象。添加以避免间接错误[^3][^5]。 ```java public class MyEntity { private Double doubleColumn; // 必须添加无参构造器 public MyEntity() {} // 其他字段和方法 } ``` 3. **测试和验证**: - 单元测试:编写测试用例模拟数据库查询,验证转换是否成功。 - 日志调试:启用JDBC或ORM框架的调试日志(如MyBatis的`log4j`),检查SQL执行和结果映射过程。 - 常见陷阱:如果`DOUBLE`列实际存储的是时间戳的毫秒值(如Unix时间戳),转换前需确保值合法(例如,值在合理时间范围内)。 4. **预防措施**: - **类型一致性**:在设计数据库和实体类时,保持类型对齐。使用工具如Liquibase管理数据库迁移。 - **框架最佳实践**:在MyBatis中,使用`@Column`注解或XML映射文件显式定义列类型。 - **错误处理**:添加全局异常处理器捕获`SQLDataException`,提供友好错误消息。 #### 注意事项 - 如果问题仅在特定环境(如测试服务器)出现,检查数据库驱动版本是否兼容(例如,更新到最新JDBC驱动)。 - 引用[^4]表明,类似异常(如DATETIME到Long)往往源于字段类型定义错误,务必双重检查[^4]。 - 如果以上步骤无效,提供更多上下文(如代码片段和表结构)以便进一步诊断。 #### 相关问题 基于此异常,以下是您可能感兴趣的相关问题: 1. 如何在MyBatis中自定义TypeHandler处理其他数据类型转换? 2. 数据库类型与Java类型的最佳映射实践是什么? 3. 常见的JDBC异常有哪些,如何快速调试? 4. 如何避免ORM框架中的类型不匹配问题? 5.Java中,如何将Unix时间戳(double类型)转换为java.sql.Timestamp?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值