1

私は以下のように例外を得ました:

2013-10-22 15:16:12 SEVERE Thread-247(247) AspectJExceptionCatcher java.lang.SecurityException: You can not modify this map
    at org.apache.harmony.security.fortress.SecurityUtils.putContext(SecurityUtils.java:78)
    at java.lang.Thread.create(Thread.java:499)
    at java.lang.Thread.<init>(Thread.java:205)
    at com.common.conn.ConnectTask.<init>(ConnectTask.java:80)
    at com.common.conn.CommuTask.<init>(CommuTask.java:43)
    at com.common.conn.ConnectionService$3.sendMsg(ConnectionService.java:144)
    at com.business.favorite.FavorManager.getFolderSong(FavorManager.java:243)
    at com.business.favorite.FavorManager$6.onResult(FavorManager.java:1465)
    at com.common.conn.CommuTask.handleData(CommuTask.java:237)
    at com.common.conn.CommuTask.run(CommuTask.java:209)

SecurityUtils.java コードを読んだ後、エラーはスレッドが既に存在することが原因です。そして、私のコードにはそのようなロジックがあります。CommnuTask はスレッドであり、その run() 関数フローで、そのタイプの別のスレッドを作成しようとします。なぜこれが禁止されているのですか?そして、それを修正する方法は?どうもありがとう。

http://svn.apache.org/repos/asf/harmony/enhanced/java/branches/mrh/drlvm/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/security/fortress/SecurityUtils.java

public static void putContext(Thread thread, AccessControlContext context)
        throws SecurityException {
    if (thread == null) {
        throw new NullPointerException("thread can not be null");
    }
    synchronized (ACC_CACHE) {
        if (ACC_CACHE.containsKey(thread)) {
            throw new SecurityException("You can not modify this map.");
        }
        if (context == null) {
            // this only allowed once - for the very first thread.
            if (ACC_CACHE.containsValue(null)) {
                throw new Error("null context may be stored only once.");
            }
        }
        ACC_CACHE.put(thread, context);
    }
}
4

0 に答える 0