Java 非静态变量当放入静态映射时,此变量

Java 非静态变量当放入静态映射时,此变量,java,static,Java,Static,我有一个静态HashMap,向其中添加一个新项,如下所示: public static void addSession(Session session) { if(!map.containsKey(session)){ map.put(session, new SessionThread(session)); } } SessionThread在本地声明如下: public class SessionThread implements Runnable { 该

我有一个静态HashMap,向其中添加一个新项,如下所示:

public static void addSession(Session session) {
    if(!map.containsKey(session)){
        map.put(session, new SessionThread(session));
    }
}
SessionThread在本地声明如下:

public class SessionThread implements Runnable {
map.put
行的编译错误为
非静态变量,无法从静态上下文引用该变量。是什么导致了错误
在该方法中的任何位置都没有引用,更不用说任何非静态成员了。所有内容要么是静态的,要么在方法的范围内

全班

package me.scratchjava;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;

/**
 * A class for managing websocket threads.
 * @author James Smyth <jimsmyth at datafascia.com>
 */
public class SessionManager {

    private static HashMap<Session, SessionThread> map = new HashMap<>();

    /**
     * Called whenever a new websocket is opened.
     * @param session 
     */
    public static void addSession(Session session) {
        if(!map.containsKey(session)){
            map.put(session, new SessionThread(session));
        }
    }

    public static void removeSession(Session session){
        if(map.containsKey(session)){
            map.remove(session);
        }
    }

    public static void sendData(Session session, byte[] bytes){
        if(map.containsKey(session)){
            map.get(session).send(bytes);
        }
    }

    public class SessionThread implements Runnable {
        private Session session;
        private boolean alive = true;
        private final LinkedList<byte[]> messageQueue = new LinkedList<>();

        public SessionThread(Session session){

        }

        @Override
        public void run() {
            while (alive) {
                if(Thread.interrupted()){
                    alive = false;
                    return;
                }

                synchronized (messageQueue) {
                    while(!messageQueue.isEmpty()){
                        byte[] msg = messageQueue.poll();
                        try {
                            session.getBasicRemote().sendBinary(ByteBuffer.wrap(msg));
                        } catch (IOException ex) {
                            Logger.getLogger(SessionManager.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }
        }

        public void send(byte[] bytes) {
            synchronized (messageQueue) {
                messageQueue.add(bytes);
            }
        }

        public void kill(){
            alive = false;
        }
    }
}
package me.scratchjava;
导入java.io.IOException;
导入java.nio.ByteBuffer;
导入java.util.HashMap;
导入java.util.LinkedList;
导入java.util.Queue;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.websocket.RemoteEndpoint;
导入javax.websocket.Session;
/**
*用于管理websocket线程的类。
*@作者詹姆斯·斯迈思
*/
公共类会话管理器{
私有静态HashMap map=newhashmap();
/**
*每当打开新websocket时调用。
*@param会话
*/
公共静态void addSession(会话){
如果(!map.containsKey(会话)){
map.put(session,新SessionThread(session));
}
}
公共静态无效移除会话(会话){
if(地图容器(会话)){
地图删除(会话);
}
}
公共静态void sendData(会话,字节[]字节){
if(地图容器(会话)){
map.get(会话).send(字节);
}
}
公共类SessionThread实现可运行{
非公开会议;
private boolean alive=true;
private final LinkedList messageQueue=新建LinkedList();
公开会议阅读(会议){
}
@凌驾
公开募捐{
(活着时){
if(Thread.interrupted()){
活着=假;
回来
}
已同步(消息队列){
而(!messageQueue.isEmpty()){
字节[]msg=messageQueue.poll();
试一试{
session.getBasicRemote().sendBinary(ByteBuffer.wrap(msg));
}捕获(IOEX异常){
Logger.getLogger(SessionManager.class.getName()).log(Level.SEVERE,null,ex);
}
}
}
}
}
公共无效发送(字节[]字节){
已同步(消息队列){
messageQueue.add(字节);
}
}
公共空杀(){
活着=假;
}
}
}

编辑


@directedition:SessionThread应该是一个静态类。实际上,它应该是一个独立的接口和类


编辑



@directedition:SessionThread应该是一个静态类。实际上,它应该是一个独立的接口和类

您的
SessionThread
内部类不是静态的。这意味着编译器会生成一个构造函数来捕获包含类的
this
的值。由于您试图用静态方法创建一个新的SessionThread,因此没有要捕获的
this
。将类设置为静态。

您的
会话读取内部类不是静态的。这意味着编译器会生成一个构造函数来捕获包含类的
this
的值。由于您试图用静态方法创建一个新的SessionThread,因此没有要捕获的
this
。将类设为静态。

如何声明
map
?显示完整的编译器错误。private static HashMap map=new HashMap();org/datapanic/syntron/server/SessionManager.java:[32,30]非静态变量不能从静态上下文中引用1错误
Session
sessionread
是如何声明的?它们是内部类吗?这个问题似乎是不完整的,而且到目前为止是有误导性的。
map
是如何声明的?显示完整的编译器错误。private static HashMap map=new HashMap();org/datapanic/syntron/server/SessionManager.java:[32,30]非静态变量不能从静态上下文中引用1错误
Session
sessionread
是如何声明的?它们是内部类吗?这个问题似乎是不完整的,到目前为止是误导性的。正如本文开头提到的,映射是静态的。@directedition:在你给我看代码之前,坦白地说,我不相信它,直到我看到它。请改进您的问题。我可能应该注意我使用的是JDK8。@directedition:请在您的问题中显示相关代码,而不是在链接中。所有人都应该能够阅读和理解它。@directedition:SessionThread应该是一个静态类。事实上,它应该是一个独立的接口和类。正如本文开头提到的,映射是静态的。@directedition:在你给我看代码之前,坦白地说,我不相信它,直到我看到它。请改进您的问题。我可能应该注意我使用的是JDK8。@directedition:请在您的问题中显示相关代码,而不是在链接中。所有人都应该能够阅读和理解它。@directedition:SessionThread应该是一个静态类。实际上,它应该是一个独立的接口和类。