帮助我的程序中的空指针异常

时间:2011-07-07 03:40:27

标签: java null nullpointerexception

返回this.permission.contains(权限);

时出现

问题

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;

}

4 个答案:

答案 0 :(得分:0)

如果将permissionID传递给程序,则set为null?这是一个问题

  if (permissionID == null) {
        this.permission = new HashSet<Permission>();
    }

给我们堆栈跟踪和调用代码。如果没有这个

,很难确定NPE的来源

答案 1 :(得分:0)

如果构造函数的permissionID为空,则permissionSet永远不会赋值。因此,如果传递了permissionID,则访问permissionSet的方法都将抛出NullPointerException。

答案 2 :(得分:0)

  1. 如果permissionID在构造函数中传递not-null,那么您的实例变量permission永远不会被初始化。因此,指向这将为您提供NPE

  2. 您的setPermission()实现是递归的。递归不会优雅地结束,也绝不会向Set添加任何内容。

  3. 可能的解决方法:

    在构造函数中初始化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。您永远不会初始化权限属性。