我写了一个if else条件,它使用if not(!)来抛出错误。但是,条件不符合我的预期,无论谁是currentUser,都会抛出错误:
public void findCorrectUserRole() {
if (Book.name.equals("Test Answers")) {
User currentUser = User.getCurrentUser()
if (currentUser) {
if (!currentUser.hasUserRole("Teacher") || !currentUser.hasUserRole("System Administrator")) {
throw new LCEX("Sorry, only a teacher or System Administrator can edit this.");
}
}
}else{
"Do Something Else"
}
}
答案 0 :(得分:4)
你做出了一个无效的假设,即逻辑非运算符与逻辑运算一样,与负号在代数中工作的方式相同。有一个名为DeMorgan's Law的规则可以帮助您安全地转换逻辑表达式。
在编写代码时,用户只有一种方法可以避免出现此异常,用户必须具有教师和系统管理员的角色:
groovy:000> a = true; b = false; !a || !b // only one is true -> true
===> true
groovy:000> a = b = false; !a || !b // neither is true -> true
===> true
groovy:000> a = b = true; !a || !b // both are true -> false
===> false
如果使用DeMorgan定律重写,则可能会更清楚(从parens中取出否定意味着运算符必须从||
更改为&&
);你的代码等同于:
if (!(currentUser.hasUserRole("Teacher")
&& currentUser.hasUserRole("System Administrator"))) {
“当前用户不具备教师和系统管理员的角色”
绝对不是你想要的。你想要的是
if (!currentUser.hasUserRole("Teacher")
&& !currentUser.hasUserRole("System Administrator")) {
“当前用户没有教师的角色,并且没有sysadmin的角色”
等价地你可以把它写成
if (!(currentUser.hasRole("Teacher")
|| currentUser.hasRole("System Administrator"))) {
“当前用户不具备教师或系统管理员的角色”
“不(A和B)”与“(不是A)或(不是B)”
相同“not(A或B)”与“(不是A)和(不是B)”相同。
答案 1 :(得分:0)
你的if条件错误应该是:
if (!currentUser.hasUserRole("Teacher") && !currentUser.hasUserRole("System Administrator")) {
throw new LCEX("Sorry, only a teacher or System Administrator can edit this.");
}
或
if (!(currentUser.hasUserRole("Teacher") || currentUser.hasUserRole("System Administrator"))) {
throw new LCEX("Sorry, only a teacher or System Administrator can edit this.");
}
现在,如果当前用户角色是"老师",他不是"系统管理员"所以if条件是真的。