помочь с исключением нулевого указателя в моей программе - PullRequest
0 голосов
/ 07 июля 2011

проблема возникает при возврате 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);
}

и вот разрешение.java

package sef.module15.activity;

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

}

Ответы [ 4 ]

0 голосов
/ 30 августа 2015

это потому, что вы пытаетесь проверить свойство из неинициализированной переменной. Попробуйте это контролировать, если у вас есть переменная прав доступа и аргумент, переданный функции, не равен нулю:

public boolean isPermissable(Permission p) {
        boolean exit = false;
        if((permission != null) && (p != null)){
              exit = permission.contains(p);
        }
        return exit;
    }

В любом случае, я рекомендую вам создать пустой конструктор для вашего класса и инициализировать все переменные

PermissionList(){
    permission = new HashSet();
}

EDIT

Я только что нашел странную вещь в вашем коде. Здесь

public PermissionList(String permissionID) {

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

    }

Вы никогда не инициализируете свое свойство разрешения, если только вы не вызовете конструктор таким образом: PermissionList myPermission = PermissionList(null), потому что у вас нет пустого конструктора, такого как PermissionList myPermission = PermissionList(), и любая строка, которую вы передадите как accessID, не будет нулевой.

Почему вы используете аргумент allowID? Где вы храните это?

Вот почему вы получаете NPE, когда вы называете this.permission в своем коде. Вы никогда не инициализируете свойство разрешения.

0 голосов
/ 07 июля 2011

Если значение permissionID конструктора равно нулю, permissionSet никогда не присваивается значение.Таким образом, если пропущен allowID, все методы, которые обращаются к accessSet, будут генерировать исключение NullPointerException.

0 голосов
/ 07 июля 2011
  1. Если permissionID передано в конструктор not-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);
    }
}
0 голосов
/ 07 июля 2011

Набор равен нулю, если accessID передается программе?Это проблема

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

Дайте нам трассировку стека и код вызова.Трудно определить источник NPE без этого

...