都写程序这么长时间,还是不免会犯极为低级的错误,这两天,还真是因为一个低级错误,让我花了很多时间去调试它。
第一个:比较对象使用“=”
为了初始化权限和用户,需要系统一启动的时候,就要将用户名和密码都初始化好。然而,每一个所有的部门是很多的,要是全部初始化了,就没有这么一个低级错误了,需要初始化的是公司管理员。从数据库中找了找关系,使用的如下的SQL:
select * from ce_surveryArea where parentOrgNo="62101"
结果得到了正常的结果。在后面过滤的时候,自然是想着也是父编号等于"621010".将代码自然写成了如下:
List<Role> areaRoles = new ArrayList<Role>();
areaRoles.add(areaRole);
for (SurveyArea surveyArea : surveyAreaManager.queryAllSurveyArea().getResultlist()) {
if(surveyArea.getParentOrgNo().="62101") {
generateUser(surveyArea, areaRoles);
}
}
这样犯了一个什么错误呢?
在短暂的时间内看代码,因为自己的思维一直停留在等于 这个词上。看出来了什么错误么?
List<Role> areaRoles = new ArrayList<Role>();
areaRoles.add(areaRole);
for (SurveyArea surveyArea : surveyAreaManager.queryAllSurveyArea().getResultlist()) {
if(surveyArea.getParentOrgNo().equals("62101")) {
generateUser(surveyArea, areaRoles);
}
}
正确的代码应该是上面的。原因何在呢?在JAVA中虽然字符串是常用对象——基本数据结构,但是他是String的对象,每次使用surveyArea.getParentOrgNo() 或的也是一个String的对象,“62101”这个字符串也是一个String对象,
两个对象使用“=” 做比较,比较的是两个对象的”引用“,永远都不会相等的——错误低级吧!
第二个:将局部变量当作全局变量使用:
有一段代码如下:
private boolean checkSurveyAreaExeit() {
User user = UserHolder.getCurrentLoginUser();
user = userManager.queryUser(user.getUserID());
surveyArea = surveyAreaManager.querySurveyArea(user.getSurveyAreaID());
if (null != surveyArea) {
return true;
}
return false;
}
在类的全局变量中也有如下的变量
@Resource(name = "surveyArea")
private SurveyArea surveyArea;
@Resource(name = "user")
private User user;
在另外一处使用的时候,直接使用了如下代码:
@SkipValidation
public String queryAll() {
LinkedHashMap<String, String> orderby = new LinkedHashMap<String, String>();
orderby.put("surveyID", "desc");
if(!checkSurveyAreaExeit()){//如果不是地区管理员
surveys = surveyManager.queryAllSurvey().getResultlist();
}else{
surveys = surveyManager.queryAllSurveyByArea(surveyArea, -1, -1, orderby);
}
if (surveys.size() == 0) {
setOperationMessage("暂无可供填写的问卷!");
return "tip";
}
return "list";
}
结果一直会报错。
经过仔细检查自己的错误,发现错误太低级了!
首先:在checkSurveyAreaExeit()方法中,不应该使用User user 这个临时变量。就算是使用了,也不该在queryAll()中把在checkSurveyAreaExeit() 中或的
surveyArea =surveyAreaManager.querySurveyArea(user.getSurveyAreaID());
当做是是已经赋值来使用。原因是虽然当前的用户是getCurrentLoginUser(),但是将getCurrentLoginUser赋值给了一个局部变量User user,其获得值将会在checkSurveyAreaExeit()有效,在外面将失效!
比较合理的写法应该是:
private boolean checkSurveyAreaExeit() {
user = UserHolder.getCurrentLoginUser();
surveyArea = surveyAreaManager.querySurveyArea(user.getSurveyAreaID());
if (null != surveyArea) {
return true;
}
return false;
}
@SkipValidation
public String queryAll() {
LinkedHashMap<String, String> orderby = new LinkedHashMap<String, String>();
orderby.put("surveyID", "desc");
if(!checkSurveyAreaExeit()){//如果不是地区管理员
surveys = surveyManager.queryAllSurvey().getResultlist();
}else{
surveys = surveyManager.queryAllSurveyByArea(surveyArea, -1, -1, orderby);
}
if (surveys.size() == 0) {
setOperationMessage("暂无可供填写的问卷!");
return "tip";
}
return "list";
}
两个低级错误,记录下来,引以为戒——需仔细!
分享到:
相关推荐
标题中提到的“任意相邻两个素数之间的最大距离公式”,指的是数学上对于素数间隔的估计。素数间隔,或者说相邻素数间的距离,是指连续两个素数差值的大小。由于素数在自然数中的分布并不是均匀的,随着数值的增大,...
高中数学中,指数和对数函数是两个极为重要的数学概念,它们不仅在高中数学考试中占有相当比重,而且在大学数学以及日常生活中的应用也非常广泛。然而,学生们在学习这些内容时,经常会遇到各种误区和错误。这篇文献...
综上所述,"用于控制两个集成电路之间的事务交换的方法"这个主题涵盖了电子政务系统中的硬件交互、事务管理、通信安全、错误处理、并发控制等多个方面,对于理解和设计高效率、高安全性的电子政务系统至关重要。...
这对于理论分析和推导极为有用,尤其是在处理复杂的数学问题时。 3. **实验一:数值模拟**:在MATLAB中,可以编写脚本来模拟各种物理或工程现象。例如,可以使用ode45函数来解决常微分方程,模拟物体的运动轨迹。...
这个“个人自用对拍CPP程序”显然针对的是C++编程,旨在帮助开发者快速定位并修复代码中的错误。它通过对比预期结果与实际运行结果来找出程序中的差异,从而帮助程序员更高效地找出代码中的bug。 C++是一种静态类型...
标题中的“两个化工控制的程序.rar”表明这是一个与化工生产控制系统相关的软件包,可能包含了用于自动化控制化工过程的编程逻辑控制器(PLC)程序。AB PLC是Allen Bradley公司的产品,它在工业自动化领域广泛应用,...
- **分析**:在这个例子中,三个格式描述符`%d %d %f`分别对应两个整型变量`a`、`b`和一个双精度浮点型变量`c`。因此,输出结果为`10 20 30.500000`。 #### 五、break语句和continue语句的区别 **知识点概述**: -...
在 Windows 7 系统中,网络连接错误 797 是一个常见的问题,导致用户无法连接到网络。这种错误通常是由 ADSL modem 连接设备未找到导致的。在本文中,我们将介绍如何解决 Windows 7 系统网络连接错误 797。 故障...
本文主要探讨了ChatGPT技术在实际应用中遇到的两个关键问题:错误处理与用户引导,并提出了解决方案。 ### 错误处理 #### 用户反馈机制 ChatGPT虽然强大,但在实际应用中难免会出现错误或不准确的回答。为了提高...
理解这两个组件的属性和用法是创建记事本应用的基础。 5. **SQLite数据库**:在Android中,常用SQLite作为本地数据存储。初学者应学习如何创建数据库、表,以及插入、查询和更新数据的方法。 6. **Intent和数据...
性质二是减去两个数的和,等同于从原始数中直接减去这两个数的和,如369-45-155。在简便计算中,这些性质可以帮助我们减少计算步骤。 拆分和凑整法是简便计算的常用策略。对于比整百、整千稍大的数,可以拆分为整数...
在量子力学中,当两个粒子发生相互作用后分开,如果它们的波函数不能被分解为两个独立的波函数,则称这两个粒子是纠缠的。这意味着我们无法单独描述任何一个粒子的状态而不考虑另一个粒子的影响。例如,如果我们有两...
将这两个分量平方和开方,我们得到总力F=sqrt(14.4^2+19.2^2)≈40 N,因此选项A正确,选项B错误。 接着,对于选项C和D,题目讨论了关门过程中锁壳碰锁舌的弹力变化情况。随着门的关闭,弹簧被进一步压缩,其弹力会...
7. 使用require()加载模块:在测试demo中,使用require()函数加载了两个模块define.js和define2.js,并通过回调函数获取这两个模块中的内容。这演示了如何加载并使用动态加载的模块。 8. 缺少容错机制:在示例中...
编码过程中,每个信息比特被送到两个编码器,生成两个独立的码流,再通过交织器混合,最后形成发送的码字。 在MATLAB中实现Turbo码,主要涉及以下几个关键步骤: 1. **信息比特生成**:根据需要传输的数据生成信息...
独立性检验主要用于判断两个分类变量之间是否存在关联,而相关分析则关注两个变量之间的线性关系强度。 1. **独立性检验**: - 基本思想:通过比较观察到的数据与假设条件下独立事件发生频率的差异,来判断两个...
对于每一个问题,不仅以建议的方式给出了被实践证明为十分优秀的解决方案,而且还给出了经常被误用或被错误理解的不好的解决方案,从正反两个方面进行了分析和对比,犹如醍醐灌顶,让人豁然开朗。
描述中提到,Beyond Compare能够对比两个文件夹或者文件,并用不同的颜色标注出差异。这种视觉化的差异显示使得用户可以快速理解并处理这些差异。例如,在进行代码版本对比时,它可以清晰地显示出哪些行被修改、添加...
在高中化学的学习中,化学反应速率与化学平衡是极为重要的两个概念,它们是理解化学反应动态过程的关键。本文主要基于两个具体的题目来深入探讨这两个知识点。 首先,我们来看第一个问题,涉及的是化学反应的熵变和...