问题
package sef.module15.activity;
import java.util.HashSet;
import java.util.Set;
public class PermissionList implements Permissable {
private Set<Permission> permission;
/**
* Creates a permission object and provides an identifier for it
*
* @param permissionID
*/
public PermissionList(String permissionID) {
if (permissionID == null) {
this.permission = new HashSet<Permission>();
}
}
public Set<Permission> getPermission() {
return permission;
}
public void removePermission(Permission... permission) {
this.permission.remove(permission);
}
public void setPermission(Permission... permission) {
if (permission == null) {
setPermission(permission);
}
}
public boolean isPermissable(Permission permission) {
return this.permission.contains(permission);
}
}
这是permissable.java
package sef.module15.activity;
import java.util.Set;
public interface Permissable {
public void setPermission(Permission... permission);
public void removePermission(Permission... permission);
public Set<Permission> getPermission();
public boolean isPermissable(Permission permission);
}
和heres permission.java
package sef.module15.activity;
public enum Permission {
READ,
WRITE,
CREATE,
DELETE,
EXECUTE;
}
答案 0 :(得分:0)
如果将permissionID传递给程序,则set为null?这是一个问题
if (permissionID == null) {
this.permission = new HashSet<Permission>();
}
给我们堆栈跟踪和调用代码。如果没有这个
,很难确定NPE的来源答案 1 :(得分:0)
如果构造函数的permissionID
为空,则permissionSet
永远不会赋值。因此,如果传递了permissionID,则访问permissionSet的方法都将抛出NullPointerException。
答案 2 :(得分:0)
如果permissionID
在构造函数中传递not-null
,那么您的实例变量permission
永远不会被初始化。因此,指向这将为您提供NPE
。
您的setPermission()
实现是递归的。递归不会优雅地结束,也绝不会向Set
添加任何内容。
可能的解决方法:
在构造函数中初始化Set
,如下所示
public PermissionList(Permission permission) {
permissions = new HashSet<Permission>(); // Change your Set name to permissions
if (permission != null) {
permissions.add(permission);
}
}
setPermissions()
方法的实施,
public void setPermissions(Permission... permissions) {
for(Permission per : permissions) {
this.permissions.add(per);
}
}
答案 3 :(得分:0)
那是因为你试图从一个未初始化的变量中检查一个属性。尝试控制权限变量和传递给函数的参数是否为null:
public boolean isPermissable(Permission p) {
boolean exit = false;
if((permission != null) && (p != null)){
exit = permission.contains(p);
}
return exit;
}
无论如何,我建议你为你的类创建一个空构造函数,并初始化所有变量
PermissionList(){
permission = new HashSet();
}
修改强>
我刚刚在你的代码中发现了一件奇怪的事情。这里
public PermissionList(String permissionID) {
if (permissionID == null) {
this.permission = new HashSet<Permission>();
}
}
你永远不会初始化你的权限属性,除非你以这样的方式调用构造函数:PermissionList myPermission = PermissionList(null)
,因为你没有像PermissionList myPermission = PermissionList()
这样的空构造函数,并且你作为permissionID传递的任何字符串都不会空。
为什么使用permissionID参数?你在哪里储存它?
这就是为什么你在你的代码中调用this.permission得到一个NPE。您永远不会初始化权限属性。