2011-07-07 3 views
0

戻り時に問題が発生する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; 

} 
+1

「呼び出しコード」とは、つまり、このクラスとそのメソッドをどのように呼び出すかです。 – PhD

+0

また、permissionがnullの場合、setPermissionはやや再帰的に見えます。 –

+0

クラスとそのメソッドを呼び出す人が更新されました – Rebel

答えて

0

permissionIDがプログラムに渡された場合のセットがnullでは?ですかそれは問題です

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

私たちにスタックトレースと呼び出しコードを教えてください。これを除いてNPEのソースを特定することは難しい

+0

http://code.google.com/p/javasummerschool/source/browse/trunk/SEF/src/sef/ module15/activity/PermissionList.java – Rebel

0

コンストラクタのpermissionIDがヌルの場合、permissionSetには決して値が割り当てられません。したがって、permissionIDが渡された場合、permissionSetにアクセスするメソッドはすべてNullPointerExceptionをスローします。

0
  1. permissionIDがコンストラクタに渡された場合は、あなたのインスタンス変数permissionが初期化になることはありません、not-nullです。したがって、それを指してNPEを与えるでしょう。

  2. setPermission()の実装は再帰的です。正常に終了せず、あなたのSetに何も追加しない再帰。

可能な修正:

あなたがチェックしようとしているため、以下のようにsetPermissions()方法、

public void setPermissions(Permission... permissions) { 
    for(Permission per : permissions) { 
     this.permissions.add(per); 
    } 
} 
+0

アサーションエラーでJUNITテストが表示されます... – Rebel

+0

@Rebel:JUnitはどこから来たのですか? –

0

のthatsの

public PermissionList(Permission permission) { 
    permissions = new HashSet<Permission>(); // Change your Set name to permissions 
    if (permission != null) { 
     permissions.add(permission); 
    }  
} 

実装をコンストラクタであなたのSetを初期化からの財産初期化されていない変数。あなたの許可変数や関数に渡された引数がnullでない場合は制御することを試してみてください:とにかく

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

は、私はあなたがあなたのクラスの空のコンストラクタを作成し、すべての変数を初期化することをお勧めします

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

編集

あなたのコードでは奇妙なことが見つかりました。 PermissionList myPermission = PermissionList(null)あなたはのような空のコンストラクタを持っていけないので、あなたがpermissionIDとして渡す任意の文字列がnullではありません。ここで

public PermissionList(String permissionID) { 

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

    } 

あなたがそのようにコンストラクタを呼び出さない限りあなたは、あなたの許可プロパティを初期化することはありません。

なぜpermissionID引数を使用しますか?どこに保管しますか?

あなたはあなたのコードでthis.permissionを呼び出すNPE wenを取得する理由があります。あなたは決してpermissionプロパティを初期化しません。