两个极为低级的错误

都写程序这么长时间,还是不免会犯极为低级的错误,这两天,还真是因为一个低级错误,让我花了很多时间去调试它。

 

第一个:比较对象使用“=”

 

为了初始化权限和用户,需要系统一启动的时候,就要将用户名和密码都初始化好。然而,每一个所有的部门是很多的,要是全部初始化了,就没有这么一个低级错误了,需要初始化的是公司管理员。从数据库中找了找关系,使用的如下的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";
	}

   

两个低级错误,记录下来,引以为戒——需仔细!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值