Java 非静态变量当放入静态映射时,此变量
我有一个静态HashMap,向其中添加一个新项,如下所示: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 { 该
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应该是一个静态类。实际上,它应该是一个独立的接口和类。