天道酬勤,学无止境

处理数据库中空字符串的最佳实践(在 Java 中)(Best practice for handling null strings from database (in Java))

问题

在我的数据库应用程序中,我有时必须处理数据库中的null字符串。 在大多数情况下,这很好,但是当它以一种形式显示数据时,Swing 组件(例如使用JTextField无法处理空字符串。 ( .setText(null)失败)

编辑:我刚刚注意到JTextField实际上接受一个null字符串,但问题仍然存在于所有其他意外null值可能导致问题的情况。)

空值没有特殊含义,它们可以(必须)被视为空字符串。

处理这个问题的最佳做法是什么? 不幸的是,我无法更改数据库

  • 在调用setText()之前检查每个值是否为null
  • 为每个setText()调用添加一个 try-catch 处理程序?
  • 引入过滤所有null字符串的静态方法?
  • 从数据库读取后立即将所有null值替换为空字符串?
  • ... [你的建议]
回答1

如果您使用任何 ORM 工具或以某种方式将 DB 字段映射到 Java bean,则始终可以拥有:

public void setFoo(String str) {
  this.foo = str != null ? str : "";
}
回答2

从 SQL 角度尝试:

select ISNULL(column_name,'') from ...
回答3

使用 Beans Binding API 将值从您的实体对象绑定到您的 SWING 小部件。 Beanins Binding 将透明地处理空值,并且不会用空字符串替换空值。

回答4

我认为您的所有答案都是合理的,但是由于您标记了“最佳实践”,因此我想提醒您注意空对象设计模式。 在任何看起来值得努力的地方,对于任何需要保护的类,为该类的“空”对象编写特殊的实例化代码。 这个想法是这个“空”对象是真实的,无论你要求它做什么,它都可以适当地表现。 您的空“字符串”对象可以提供您想要的任何值。

这种模式还意味着您可以摆脱大量的空检查,并且代码更加健壮。 它确实消耗了一些 CPU 向空值发送消息并且让它们不做任何事情,因此当预计大部分对象为空时不太理想。

回答5

如果可以,请为 DB 中的字段添加默认值 - 空字符串。

回答6

您可以扩展或包装 JTextField 并覆盖 setText() 方法以将 NULL 替换为空字符串。

回答7

正如鲁本所说,我将扩展 JTextField 以覆盖 setText() 方法并用空字符串替换 NULL。

但是,我也会覆盖 getText() 方法以用 NULL 覆盖空字符串,这样当您保存回数据库时,您就不会用空字符串覆盖其中的空值。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在 Java 中操作和存储日期的最佳实践是什么? [复制](What is the Best Practice for manipulating and storing dates in Java? [duplicate])
    问题 这个问题在这里已经有了答案: 面向不同地域用户的日期操作/存储的 Java 最佳实践(2 个回答) 2 个月前关闭。 操作和存储日期的最佳实践是什么,例如在企业 Java 应用程序中使用 GregorianCalendar? 寻求反馈,我会将任何出色的答案整合为其他人可以使用的最佳实践。 回答1 乔达是要走的路。 为什么 ? 它具有比标准日期/时间 API 更强大、更直观的界面日期/时间格式没有线程问题。 java.text.SimpleDateFormat 不是线程安全的(不是很多人知道这一点!) 在某个阶段,Java 日期/时间 API 将被取代(由 JSR-310)。 我相信这将基于 Joda 背后的人所做的工作,因此您将学习一个影响新标准 Java API 的 API。 回答2 最佳实践通常是不考虑重日期对象,而是存储一个时间点。 这通常是通过存储一个不受极端情况或潜在解析问题影响的值来完成的。 为此,人们通常会存储自我们称为纪元 (1970-01-01) 的固定点以来经过的毫秒数(或秒数)。 这是很常见的,任何 Java API 都将始终允许您将任何类型的日期转换为自纪元以来以毫秒表示的时间。 那是为了存储。 如果有这样的需要,您还可以存储,例如,用户的首选时区。 现在这样一个以毫秒为单位的日期,例如: System.out.println( System
  • 使用 JSTL/Tomcat 进行财务计算的最佳实践 [关闭](Best Practice for financial calculations using JSTL/Tomcat [closed])
    问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 2年前关闭。 改进这个问题 我正在使用 Tomcat/JSTL/MySQL/etc 构建一个新的电子商务平台。 我知道与使用浮点计算相关的各种问题 - 例如 12.3456000000000789...我知道舍入与截断也可能是一个问题。 在不将所有业务逻辑移到 Java 类中的情况下,在保持架构简单的同时对货币进行可靠计算的最佳方法是什么? 我对可能性的想法包括: 隔离问题计算并单独处理将数字表示为 long 并使用 cents 进行计算使用 BigDecimal 并在 Java 中进行所有计算尽可能将数字存储在字符串中使用 <fmt:formatNumber var="... 而不是 <c:set var="... 我可能不是第一个这样做的人。 最直接的方法是什么? 回答1 隔离问题计算并单独处理 不是答案。 无论您使用什么技术,都将来自您列表中的其他地方。 将数字表示为 long 并使用 cents 进行计算 可行但很笨拙,在金融领域,有些情况下一分钱是有效的:例如,外汇。 使用 BigDecimal 并在 Java 中进行所有计算 这就是答案。 更好的是,在数据库中进行计算。 尽可能将数字存储在字符串中 不是答案。 您仍然需要计算,当您计算时
  • 防止跨站点脚本编写的Java最佳实践(Java Best Practices to Prevent Cross Site Scripting [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 我浏览了OWASP的十大漏洞,发现跨站点脚本是我们必须记录的漏洞。 很少有推荐的解决方案。 有人指出,请勿使用“黑名单”验证来检测输入中的XSS或对输出进行编码。 仅搜索和替换几个字符( <和>以及其他类似字符或短语,例如script )的能力很弱,并且已成功受到攻击。 在某些情况下,即使未选中的“<b>”标签也不安全。 XSS具有数量惊人的变体,可以轻松绕过黑名单验证。 另一个解决方案说是强输出编码。 在呈现之前,请确保所有用户提供的数据都经过适当的实体编码(取决于输出机制是HTML还是XML)。 那么,防止跨站点脚本验证和替换输入或编码输出的最佳方法是什么? 回答1 通常的做法是在JSP中重新显示期间,而不是在servlet中处理提交的数据期间或在DB中存储期间,对所有用户控制的数据进行HTML转义。 在JSP中,您可以使用JSTL(要安装它,只需将jstl-1.2.jar放在/WEB-INF/lib )<c:out>标记或fn:escapeXml函数即可。 例如 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ... <p
  • 集成测试最佳实践(Integration Testing best practices)
    问题 我们的团队有数百个集成测试,可以访问数据库并验证结果。 我有两个用于所有集成测试的基类,一个用于仅检索测试,另一个用于创建/更新/删除测试。 仅检索基类在 TestFixtureSetup 期间重新生成数据库,因此每个测试类只执行一次。 CUD 基类在每次测试之前重新生成数据库。 每个存储库类都有自己对应的测试类。 可以想象,这整个过程需要相当长的时间(运行接近 7-8 分钟并快速增长)。 将此作为我们 CI (CruiseControl.Net) 的一部分运行不是问题,但在本地运行需要很长时间,并且在提交代码之前确实禁止运行它们。 我的问题是是否有任何最佳实践可以帮助加速执行这些类型的集成测试? 我无法在内存中执行它们(如 sqlite),因为我们使用了一些 SQLite 不支持的特定于数据库的功能(计算列等)。 此外,整个团队必须能够执行它们,因此在 SQL Server Express 的本地实例或其他东西上运行它们可能容易出错,除非这些实例的连接字符串都相同。 你是如何在你的商店里做到这一点的,什么效果很好? 谢谢! 回答1 将您的快速(单元)和慢速(集成)测试分开,以便您可以单独运行它们。 使用测试框架提供的任何方法对测试进行分组/分类。 如果测试框架不支持对测试进行分组,请将集成测试移动到只有集成测试的单独模块中。 快速测试应该只需几秒钟即可运行所有测试
  • 在不同编程语言之间传递加密数据的最佳实践(Best practices for passing encrypted data between different programming languages)
    问题 我已经读过,如果您想使用一种编程语言加密一个字符串并使用另一种编程语言解密该字符串,那么为了确保兼容性,最好在进行加密之前进行一些转换。 我读过加密字符串的字节数组而不是字符串本身是最佳实践。 另外,我已经读到某些加密算法希望每个加密数据包的大小都是固定的。 如果要加密的最后一个数据包不是所需的大小,则加密将失败。 因此,对首先转换为固定长度(例如十六进制)的数据进行加密似乎是个好主意。 我正在尝试确定通常有用的最佳实践,而不管所使用的加密算法如何。 为了在跨不同语言和平台加密和解密数据时最大限度地提高兼容性,我想对以下步骤作为一个过程进行批评: 加密: 以纯文本字符串开头将纯文本字符串转换为字节数组将字节数组转换为十六进制将十六进制加密为加密字符串以加密字符串结尾 解密: 以加密字符串开头将加密字符串解密为十六进制将十六进制转换为字节数组将字节数组转换为纯文本字符串以纯文本字符串结尾 回答1 真正的加密最佳实践是使用高级加密框架,使用这些原语可能会犯很多错误。 如果您不使用高级加密框架,mfanto 在提及您需要了解的重要事项方面做得很好。 我猜,如果你想最大限度地提高跨编程语言的兼容性,那是因为你需要其他开发人员与加密进行互操作,然后他们也需要学习使用加密的低级细节。 所以我对高级框架的建议是使用 Google Keyczar 框架,因为它为您处理算法、密钥管理、填充
  • Java或C#中异常管理的最佳实践(Best practices for exception management in Java or C# [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 改善这个问题 我一直在决定如何处理应用程序中的异常。 如果我的异常问题很大程度上来自于1)通过远程服务访问数据或2)反序列化JSON对象。 不幸的是,我不能保证其中任何一项都能成功(切断网络连接,无法控制的格式错误的JSON对象)。 结果,如果确实遇到异常,我将在函数中捕获该异常并将FALSE返回给调用方。 我的逻辑是,调用者真正关心的只是任务是否成功,而不是为什么任务没有成功。 这是一些典型方法的示例代码(在JAVA中) public boolean doSomething(Object p_somthingToDoOn) { boolean result = false; try{ // if dirty object then clean doactualStuffOnObject(p_jsonObject); //assume success (no exception thrown) result = true; } catch(Exception Ex) { //don't care about exceptions Ex.printStackTrace(); } return result; } 我认为这种方法很好
  • 在 C# 中处理 Unicode 字符串的最佳实践是什么? [关闭](What are the best practices for handling Unicode strings in C#? [closed])
    问题 关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来关注一个问题。 5年前关闭。 改进这个问题 有人可以向我提供一些在 C# 中处理 Unicode 字符串时应该注意的重要方面吗? 回答1 请记住,C# 字符串是 Char、UTF-16 代码单元的序列。 它们不是Unicode 代码点。 某些 unicode 代码点需要两个 Char,您不应在这些 Char 之间拆分字符串。 此外,unicode 代码点可以组合形成单个语言“字符”——例如,“u”字符后跟 umlat 字符。 因此,您也不能在任意代码点之间拆分字符串。 基本上,这是一堆问题,任何给定的问题可能只会在实践中影响您不知道的语言。 回答2 C#(以及一般的 .Net)透明地处理 unicode 字符串,除非您的应用程序需要读取/写入具有特定编码的文件,否则您无需执行任何特殊操作。 在这些情况下,您可以使用 System.Text.Encodings 命名空间中的类将托管字符串转换为您选择的编码的字节数组。 回答3 System.String 已经在内部处理了 unicode,所以你在那里被覆盖。 最佳实践是在读取和写入文件时使用 System.Text.Encoding.UTF8Encoding。 然而,这不仅仅是读取/写入文件,任何流式传输数据(包括网络连接
  • 在PHP中使用货币值的最佳实践?(Best practice for working with currency values in PHP?)
    问题 我需要添加,乘以和比较PHP中的货币值,并且需要确保它精确到一美分。 一种方法是将所有内容存储在浮点中,在每次操作之前和之后使用回合,并在比较相等时使用头脑机epsilon。 非常笨拙的恕我直言。 另一种方法是将整件以美分的形式存储在整数数据类型中,另外,请记住,只要我使用数据库(mysql,我使用十进制数据类型),就可以进行来回转换。 恕我直言,许多错误陷阱。 另一种方法是发明自己的“数据类型”,将所有值存储在字符串中(“ 34.12”),并创建自己的数学替换函数。 这些函数将在内部将值转换为整数,进行计算并再次将结果输出为字符串。 令人惊讶的是,恕我直言。 我的问题:在PHP中使用货币值的最佳实践是什么? 谢谢! 回答1 从MySQL v5.0.3开始,MySQL的DECIMAL数据类型存储一个精确的十进制数,即不是一个不准确的浮点表示形式。 要在PHP中正确处理精度数字,请使用任意精度数学函数。 在内部,此库处理文本字符串。 货币旨在存储为十进制数字,您可以获得的货币单位小于美分。 仅应在显示图形时四舍五入任何值,而不是在操作或存储期间四舍五入。 回答2 2016年更新: 几年后,希望更明智一些;) 由于此答案仍然偶尔会受到上下投票,因此我觉得有必要修改我的答案。 我绝对不建议再将“金钱”存储为整数。 唯一的真实答案是安德鲁·邓恩(Andrew Dunn)
  • 是否有人有任何好的SSIS最佳实践提示和建议? [关闭](Does anyone have any good SSIS Best-Practices tips and suggestions? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 5年前关闭。 改善这个问题 我想听听其他开发人员提供的有关SSIS最佳做法,注意事项,陷阱和技巧等的提示。 我想在公司介绍一些。 回答1 杰米·汤普森(Jamie Thompson)撰写的博客非常好,具有最佳实践和命名约定:BestPracticesandNamingConventions 回答2 SSIS使用的DT_WSTR (Unicode字符串)数据类型有4000个字符的限制。 由于表达式已转换为DT_WSTR ,因此它们也不能超过4000个字符。 如果在设计时超出限制,则会收到错误消息。 但是,如果在运行时这样做,您将不会收到任何明显的警告或错误。 该操作将以静默方式失败,并且表达式可能无法正确求值。 注意:这并不意味着字符串或SSIS变量不能超过4000个字符。 该限制仅适用于表达式和使用DT_WSTR的其他位置。 为了对此有一个很好的解释,请看一下: http://blogs.conchango.com/jamiethomson/archive/2009/05/27/4000-character-limit-in-ssis.aspx 这是重现此问题的示例: 创建一个名为testVariable的SSIS字符串变量。
  • Hibernate / JPA DB模式生成最佳实践(Hibernate/JPA DB Schema Generation Best Practices)
    问题 我只是想听听Hibernate专家对基于Hibernate / JPA的项目的数据库模式生成最佳实践的看法。 尤其: 项目刚开始时要使用什么策略? 是否建议让Hibernate在此阶段自动生成模式,还是从项目的最早阶段手动创建数据库表更好? 假装在整个项目中使用Hibernate来生成模式,是否最好在系统发布到生产环境之前禁用自动模式生成并手动创建数据库模式? 在系统投入生产后,维护实体类和数据库模式的最佳实践是什么(例如,添加/重命名/更新列,重命名表等)? 回答1 始终建议手动生成模式,最好使用支持数据库模式修订的工具(例如出色的Liquibase)手动生成模式。 从实体生成模式在理论上很棒,但是在实践中却很脆弱,从长远来看会引起很多问题(请相信我)。 在生产环境中,最好总是手动生成并查看模式。 您对实体进行更新,并创建匹配的更新脚本(修订)以更新数据库架构以反映实体更改。 您可以创建一个自定义解决方案(我已经写了一些)或使用像liquibase这样更流行的东西(它甚至支持架构更改回滚)。 如果您使用的是诸如maven或ant之类的构建工具,建议将db schema update util插入构建过程中,以便新的构建与该架构保持同步。 回答2 尽管有争议,但我想说所有三个问题的答案是:让hibernate自动在模式中生成表。 到目前为止,我还没有任何问题。
  • Java最佳实践,适用于不同地理位置的用户进行日期处理/存储(Java Best Practice for Date Manipulation/Storage for Geographically Diverse Users)
    问题 我已经阅读了有关日期操作的所有其他Q / A,但是似乎都没有一个令人满意的答案回答我的问题。 我有一个具有不同地理位置用户的项目,该项目在某些类和数据中使用Date 。 事实是,我正在寻找一种有效的方式来为不同用户在各自的时区中操作日期,大多数答案都建议使用Joda库进行Date操作,因为我仍然没有发现任何东西,所以这还不太了解您无法使用传统Java执行此操作,因此,如果有人可以解释使用传统Java无法完成的Joda用途,那么我可以考虑使用它。 我终于找到了使用System.currentTimeMillis()将日期保存到数据库(任何数据库)中的方法。 这样可以避免我担心使用数据库存储日期的时区。 如果要在数据库中查询特定日期或日期范围,我将使用要查询的Date的long值执行查询: SELECT * FROM table1 WHERE date1>=1476653369000 当检索ResultSet我将使用请求数据的用户所在的时区将从数据库中检索到的long值格式化为可读的Date 。 Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(resultSet.getLong(1)); cal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta")); Date
  • PHP/MySQL:最佳资金操作/存储实践?(PHP/MySQL: Best money operations/storing practices?)
    问题 所以,我打算做一个处理大量金钱的应用程序(PHP/MySQL),我正在考虑如何存储和操作金钱,参考PHP浮点数据类型和MySQL十进制。 我在想两种选择。 其中之一是以整数美分格式($dollars * 100)操作和存储货币,以便不处理浮点不精确并将其也作为整数存储在数据库中。 另一种是以十进制形式存储在DB中,并在PHP中使用BC Math进行计算。 所以我整夜在谷歌上搜索,找出哪个是最好的选择,但没有找到明确的答案。 我见过的唯一合理的选择是整数美分(我真的不喜欢它,因为它意味着在浏览器中的每次显示之前和存储在数据库中之前,从美元到美分进行大量转换,反之亦然)。 此外,人们抱怨 MySQL 十进制(MySQL 将小数存储为字符串,将它们操作为浮点数等),但那是旧帖子。 根据 MySQL 文档,当前版本正确处理小数,唯一的抱怨是它截断了超过声明的分数长度的值的分数(例如,如果您将 12.326 的值存储在声明为 decimal(9,2) 的列中) ,但从我的调查来看,它会四舍五入,而不仅仅是截断(12.326 变为 12.33),这在我看来是正确的。 而且,我没有找到任何关于将钱存为小数并使用 PHP BCMath 进行计算的建议,在我看来,这是因为很少有人知道 BC 和 GMP 数学函数。 那么,考虑到精度、速度(BCMath 计算速度、MySQL 十进制速度与整数
  • 构建ASP.NET应用程序-最佳实践(Building ASP.NET application - Best Practices)
    问题 我们正在构建一个ASP.NET应用程序,并希望遵循最佳实践。 一些最佳做法是: 服务器端代码: 也可以使用catch块来捕获和记录低级错误。 使用缓存对象来填充下拉列表等,在这些地方我们不会期望基础数据库/数据库中的更改。 如果是错误记录框架,请提供电子邮件警报以及记录错误。 HTML代码:-不要编写内联CSS。 -除非页面需要执行加载时间操作,否则将JavaScript代码(如果页面需要)放置在页面的末尾。 现在到了要点,如果您已经有了这些最佳实践点的完整列表,请您分享一下这些最佳实践点吗? 回答1 随着时间的推移,我学到了一些最佳实践,并已写成供我公司使用...许多主要适用于WebForms,而不适用于MVC。 不要直接在ASPX标记中编写.NET代码(除非它用于数据绑定,即Eval)。 如果后面有代码,则这会将页面的代码放置在多个位置,并使代码的可管理性降低。 将所有.NET代码放在您的代码中。 SessionPageStatePersister可以与ViewState结合使用,以使ViewState有用,而无需增加页面大小。 用新的SessionPageStatePersister覆盖Page的PageStatePersister会将所有ViewState数据存储在内存中,并且只会在客户端存储加密的密钥。 创建您的页面可以继承的BasePage
  • 单元/集成测试中文件系统依赖项的最佳实践(Best practices for file system dependencies in unit/integration tests)
    问题 我刚开始为很多代码编写测试。 有一堆依赖于文件系统的类,即它们读取 CSV 文件、读取/写入配置文件等。 目前,测试文件存储在项目的 test 目录中(它是一个 Maven2 项目),但由于多种原因,该目录并不总是存在,因此测试失败。 您知道在单元/集成测试中处理文件系统依赖项的最佳实践吗? 编辑:我不是在为我上面描述的那个特定问题寻找答案。 那只是一个例子。 我更喜欢如何处理对文件系统/数据库等的依赖的一般建议。 回答1 第一个应该尝试使单元测试远离文件系统- 请参阅此单元测试规则集。 如果可能的话,让您的代码使用 Streams,这些 Streams 将成为单元测试的缓冲区(即内存中),以及生产代码中的 FileStream。 如果这不可行,您可以让您的单元测试生成他们需要的文件。 这使得测试易于阅读,因为所有内容都在一个文件中。 这也可以防止权限问题。 您可以在单元测试中模拟文件系统/数据库/网络访问。 您可以将依赖数据库或文件系统的单元测试视为集成测试。 回答2 对文件系统的依赖在这里有两种形式: 您的测试所依赖的文件; 如果您需要文件来运行测试,那么您可以在测试中生成它们并将它们放在/tmp目录中。 您的代码所依赖的文件:配置文件或输入文件。 在第二种情况下,通常可以重新构建您的代码以消除对文件的依赖(例如 java.io.File 可以替换为java.io
  • 在页面之间共享数据的最佳实践(Best practice for sharing data between pages)
    问题 我想知道在 UWP 中的页面之间发送诸如“selectedItem”之类的变量的最佳实践是什么? 创建一个每个 Page 都知道的静态全局变量类是个好主意吗? 回答1 我将在这里总结微软的最佳实践: 对于简单数据(如字符串): 使用 Frame.Navigate(TypeName, Object) 方法,其中第二个参数应该始终是一个字符串(即使它允许对象)。 然后可以从 Frame.Navigated 事件处理程序中的 NavigationEventArgs.Parameter 中提取第二个参数。 对于复杂数据(字符串以外的任何内容): 您可以在此处从两个选项中进行选择,具体取决于您的应用程序的大小和复杂性: 直接管理对App类中任何复杂数据的引用或者在任何类型的Manager类中保留对它们的引用,即App类的成员。 (例如NavigationDataManager )。 回答2 事实上,如果你使用 MVVM 方法,你在 ModelView 类中拥有所有必要的信息。 如果您不使用 MVVM,只需使用单例类甚至静态全局类。
  • C#:引发自定义异常最佳实践(C#: Throwing Custom Exception Best Practices)
    问题 我已经阅读了一些其他有关C#异常处理实践的问题,但似乎没有人问我在寻找什么。 如果我为一个特定的类或一组类实现自己的自定义Exception。 应该使用内部异常将与这些类相关的所有错误封装到我的异常中,还是让它们通过? 我认为最好捕获所有异常,以便可以从我的来源中立即识别出该异常。 我仍然将原始异常作为内部异常传递。 另一方面,我认为重新抛出该异常将是多余的。 例外: class FooException : Exception { //... } 选项1:Foo封装了所有异常: class Foo { DoSomething(int param) { try { if (/*Something Bad*/) { //violates business logic etc... throw new FooException("Reason..."); } //... //something that might throw an exception } catch (FooException ex) { throw; } catch (Exception ex) { throw new FooException("Inner Exception", ex); } } } 选项2:Foo引发特定的FooException,但允许其他异常通过: class Foo {
  • 在 C# 中优化内存的最佳实践 [关闭](Best practices to optimize memory in C# [closed])
    问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 7年前关闭。 改进这个问题 在 C# 中优化内存的最佳做法是什么。 我正在使用以下技术来优化我的记忆。 使用后处理对象或使其为空。 使用 try/finally 或使用块。 如果需要,请使用 GC.Collect()。 删除不必要的对象初始化。 管理图像缓存。 管理BLOB数据、内存流和文件流 即使有内存泄漏。 我的应用程序正在使用以下内容: 处理配置文件, 使用其他 XML 文件。 使用图像功能放大,缩小,显示不同类型的图像,改变图像的颜色,将数据保存在xml中。 在 SQL 服务器中保存数据。 回答1 您可以使用Redgate ANTS 内存分析器(非免费)。 或CLR 分析器(免费):https://msdn.microsoft.com/library/ms979205 不推荐使用GC.Collect()即使在某些情况下需要它。 请看下面的代码: private void WriteStringOnImage() { try { byte[] imgData = getData(@"E:\0000.tif"); using (System.Drawing.Image img = System.Drawing.Image.FromStream
  • 生成重置密码令牌的最佳实践(Best practice on generating reset password tokens)
    问题 关于如何构建重置密码令牌的最佳实践? 我在想: 随机 17 个字符 [a-zA-Z0-9] + 全局唯一 ID + 随机 17 个字符 [a-zA-Z0-9]。 是否有更好的解决方案或重置密码令牌的行业标准? 回答1 有一些重要的点需要考虑。 代码应该是真正随机的(从 MCRYPT_DEV_URANDOM 读取),并且不应该从其他用户相关信息中导出。 理想情况下,代码采用 base62 编码 (AZ az 0-9) 以避免 Url 出现问题。 仅在数据库中存储令牌的哈希值,否则具有数据库读取权限的攻击者可以重置任何帐户。 这导致您必须在用户单击链接后在数据库中找到令牌的哈希值的问题。 有两种可能的方式来存储令牌: 您可以使用哈希算法(如 SHA512 不加盐)对令牌进行哈希处理。 如果令牌非常强(最小长度为 20,0-9 az AZ),这是安全的。 从理论上讲,您必须在将其输入数据库之前检查此类哈希是否已存在,实际上这可以忽略不计。 我实现了一个可以处理此类令牌的密码重置类。 你用 BCrypt 和 salt 散列令牌。 这允许使用较短的令牌,但您无法在数据库中搜索散列令牌。 相反,您必须在链接中包含一个行 ID 才能找到令牌。
  • 为 webapp 存储临时数据的最佳实践 [重复](Best practice to store temporary data for a webapp [duplicate])
    问题 这个问题在这里已经有了答案: 如何在基于 servlet 的 Web 应用程序中临时保存生成的文件(2 个回答) 4年前关闭。 我的最新项目能够使用数据库中的信息生成文档。 因此,我根据需要将文档模板复制到用户的临时文件夹中并进行修改。 我这样做是因为每个模板在修改过程中都必须可用。 之后,用户将通过我的 web 应用程序的下载链接获得他的文档。 我的问题:是否有存储 webapp 数据的最佳实践? 我认为 temp 会很好。 但是因为我必须自己删除数据,所以我想把它放在我的 WAR 文件夹之外的 tomcat webapp 文件夹中。 我使用 Windows 2003 作为带有 Tomcat 的主机系统。 我的项目使用 Grails、Java 和 Maven……不知道是否需要这些信息。 编辑: 我问这个微不足道的问题的主要原因是......如果我负责创建/删除我的临时数据......在系统上使用临时文件夹仍然是一个好习惯吗? 我不确定这... 回答1 在 webapp 中存储(敏感)特定于用户的文件时,确保将其存储在/WEB-INF某个位置并使用Servlet访问它们,该Servlet (间接)检查登录用户,否则世界上的任何用户/黑客都可以访问它万维网。 优点是它可以通过ServletContext#getResource()或#getRealPath()编程方式轻松访问。
  • JSP Servlet 中的最佳实践错误处理(Best practice error handling in JSP Servlets)
    问题 我有一个在 Oracle 数据库上使用 jsp/servlets 的非常简单的 Web 应用程序。 该应用程序目前只有少数页面,但它正在增长。 截至目前,我没有任何显示用户错误的内容。 例如,如果数据库连接失败,页面就是空白。 我很好奇错误处理的最佳实践是什么? 我应该打印出堆栈跟踪吗? 所有错误都应该转到默认错误页面吗? 任何建议或参考资料将不胜感激。 你可能会说,这对我来说有点新鲜。 谢谢 回答1 对于被认为不可恢复的错误(例如数据库连接问题),这些类型的错误通常在应用程序的最顶层捕获并在一个地方处理。 许多框架会将这些转换为未经检查的异常以避免中间层不得不处理它们。 对于这些不可恢复的异常,通常您会向用户显示一个用户友好且相当通用的错误页面,并将堆栈跟踪(包含更详细的信息)发送到日志文件 - 供系统管理员和/或开发人员询问。 servlet 规范提供了一种通过web.xml通过error-page标记处理错误的方法。 如果您使用的是 Servlet 3.0 或更高版本,则可以在您的web.xml中添加: <error-page> <location>/error.html</location> </error-page> 这将捕获所有未处理的异常并将它们发送到 web 应用程序根目录中的error.html页面。 在 servlet 规范的早期版本中