热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java返回int型的空值,从JavaResu检查nullint值

从JavaResu检查nullint值在Java中,我试图从ResultSet中测试一个空值,其中列被转换为原始int类型。intiVal;Result

从Java Resu检查null int值

在Java中,我试图从ResultSet中测试一个空值,其中列被转换为原始int类型。

int iVal;

ResultSet rs = magicallyAppearingStmt.executeQuery(query);

if (rs.next()) {

if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {

iVal = rs.getInt("ID_PARENT");

}

}

从上面的代码片段,有更好的方法来做到这一点,我假设第二个isNull()测试是多余的?

教育我们,谢谢

ian_scho asked 2019-03-03T17:21:58Z

9个解决方案

305 votes

当字段值为NULL时,iVal的默认值是返回0,这也是iVal声明的默认值。 在这种情况下,您的测试完全是多余的。

如果你真的想要做一些不同的事情,如果字段值是NULL,我建议:

int iVal = 0;

ResultSet rs = magicallyAppearingStmt.executeQuery(query);

if (rs.next()) {

iVal = rs.getInt("ID_PARENT");

if (rs.wasNull()) {

// handle NULL field value

}

}

(编辑为@martin评论如下;编写的OP代码无法编译,因为iVal未初始化)

Richard answered 2019-03-03T17:22:23Z

72 votes

另一种方案:

public class DaoTools {

static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {

int nValue = rs.getInt(strColName);

return rs.wasNull() ? null : nValue;

}

}

Patrice IMBERT answered 2019-03-03T17:22:43Z

26 votes

我认为,这是多余的。 rs.getObject("ID_PARENT")应返回Integer对象或null,如果列值实际为NULL.所以甚至应该可以执行以下操作:

if (rs.next()) {

Integer idParent = (Integer) rs.getObject("ID_PARENT");

if (idParent != null) {

iVal = idParent; // works for Java 1.5+

} else {

// handle this case

}

}

Andreas_D answered 2019-03-03T17:23:11Z

20 votes

只需检查字段是否为ResultSet#getObject()或不使用ResultSet#getObject()。用您想要的任何空值大小替换Integer。

int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;

或者,如果您可以保证使用正确的DB列类型,以便ResultSet#getObject()确实返回Integer(因此不是Long,Short或Byte),那么您也可以将其类型转换为Integer。

Integer foo = (Integer) resultSet.getObject("foo");

BalusC answered 2019-03-03T17:23:46Z

8 votes

你可以简单地使用AFAIK

iVal = rs.getInt("ID_PARENT");

if (rs.wasNull()) {

// do somthing interesting to handle this situation

}

即使它是NULL。

Peter Tillemans answered 2019-03-03T17:24:21Z

1 votes

为方便起见,您可以在ResultSet周围创建一个包装类,当ResultSet通常不会返回空值时返回空值。

public final class ResultSetWrapper {

private final ResultSet rs;

public ResultSetWrapper(ResultSet rs) {

this.rs = rs;

}

public ResultSet getResultSet() {

return rs;

}

public Boolean getBoolean(String label) throws SQLException {

final boolean b = rs.getBoolean(label);

if (rs.wasNull()) {

return null;

}

return b;

}

public Byte getByte(String label) throws SQLException {

final byte b = rs.getByte(label);

if (rs.wasNull()) {

return null;

}

return b;

}

// ...

}

Jacob Crofts answered 2019-03-03T17:24:49Z

1 votes

只是Java Generics的更新。

您可以创建一个实用程序方法,以从先前生成的给定ResultSet中检索任何Java类型的可选值。

不幸的是,getObject(columnName,Class)不返回null,而是返回给定Java类型的默认值,因此需要2次调用

public T getOptionalValue(final ResultSet rs, final String columnName, final Class clazz) throws SQLException {

final T value = rs.getObject(columnName, clazz);

return rs.wasNull() ? null : value;

}

在此示例中,您的代码可能如下所示:

final Integer columnValue = getOptionalValue(rs, Integer.class);

if (columnValue == null) {

//null handling

} else {

//use int value of columnValue with autoboxing

}

很高兴得到反馈

luchoct answered 2019-03-03T17:25:45Z

0 votes

使用java 8,您可以这样做:

Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))

.map(BigDecimal::longValue).orElse(null));

在这种情况下,如果SQL值为NULL,则确保nVal为空(而不是零)

George answered 2019-03-03T17:26:21Z

-5 votes

如果您控制SQL,另一种检查的好方法是在int列的查询本身中添加一个默认值。 然后检查该值。

例如,对于Oracle数据库,请使用NVL

SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;

然后检查

if (rs.getInt('ID_PARENT') != -999)

{

}

当然,这也是假设存在通常在列中找不到的值。

Chris answered 2019-03-03T17:27:10Z



推荐阅读
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 在数据库设计中,谨慎使用外键至关重要。本文探讨了九个关键原因,包括数据完整性的维护、性能优化、系统复杂性的管理、数据迁移的灵活性以及对外部系统的依赖性控制。通过深入分析这些因素,可以帮助开发人员和架构师做出更明智的设计决策,确保数据库系统的高效与稳定。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 本文详细探讨了MySQL数据库实例化参数的优化方法及其在实例查询中的应用。通过具体的源代码示例,介绍了如何高效地配置和查询MySQL实例,为开发者提供了有价值的参考和实践指导。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 润乾报表JNDI配置异常分析与解决方法
    在使用润乾报表时,通过JNDI连接数据源是常见的配置方式。本文详细分析了JNDI配置异常的原因,并提供了具体的解决方法。重点讨论了JNDI名称在三个关键位置的配置:1. Tomcat或应用服务器的数据源配置(以Tomcat为例);2. 润乾报表中的数据源配置;3. 应用程序代码中的JNDI名称引用。通过这些步骤,可以有效解决JNDI配置异常问题,确保报表系统的稳定运行。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • Java 点餐系统源代码附带管理后台(免费提供)
    本项目提供了一套基于 Java 的点餐系统,包括前端小程序和后端管理平台。采用 Spring Boot 和 SSM 框架,结合 MySQL 和 Redis 数据库技术,适用于学习和二次开发。有需要源代码的开发者可以通过私信联系,免费获取下载链接。 ... [详细]
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
author-avatar
九育
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有