【问题标题】:help with a null pointer exception in my program帮助我的程序中的空指针异常
【发布时间】:2011-09-30 03:18:07
【问题描述】:

问题发生在返回 this.permission.contains(permission);

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);
}

这里是permission.java

package sef.module15.activity;

public enum Permission {
    READ,
    WRITE,
    CREATE,
    DELETE,
    EXECUTE;

}

【问题讨论】:

  • 什么是“调用代码”,即谁调用了这个类及其方法?
  • setPermission 如果权限也为空,则看起来有点递归。
  • 更新了调用类和涉及的方法
  • 不够。 WHERE 是实现接口的具体类和它调用的实际方法???当您遇到异常时,调用流程 = 堆栈跟踪打印! (您的相关类)使用调用 setPermission 或 getPermission 等的实际代码行进行更新,

标签: java null nullpointerexception


【解决方案1】:

那是因为您试图从未初始化的变量中检查属性。尝试控制您的权限变量和传递给函数的参数是否不为空:

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() 这样的空构造函数,并且您作为权限ID 传递的任何字符串都不会为空。

为什么要使用 permissionID 参数?你把它存放在哪里?

这就是为什么您在代码中调用 this.permission 时会获得 NPE。您永远不会初始化权限属性。

【讨论】:

    【解决方案2】:
    1. 如果在构造函数中传递的permissionIDnot-null,那么你的实例变量permission 永远不会被初始化。因此,指向它会给你一个NPE

    2. 您的 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);
        }
    }
    

    【讨论】:

    • @Rebel:JUnit 从何而来?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果permissionID 被传递给程序,该集合是否为空?这是个问题

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

      给我们堆栈跟踪和调用代码。没有这个就很难确定NPE的来源

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多