Java不会改变变量

标签 java

这就是我正在编写的代码。这只是一种实践,这让我困扰了一段时间。问题是我试图将第二个类中传递的参数(UDPServer 服务器)应用到该类的全局变量( myserv),这样我就可以在 run 方法中使用它。问题是它说 server 不是 NULL(这是可以的,它可以工作),但是 myserv 是 NULL 并且它不会改变......这可能是一些愚蠢的错误,但我好像没找到。

package Server;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

public class UDPServer{
  JFrame frame;
  JPanel panel;
  JButton button1,button2;
  JTextArea area;
  JScrollPane pane;
  StartThread thread1;
  UDPServer u;

  public static void main(String[] args) {
  UDPServer u = new UDPServer();
  }
  public UDPServer(){
  frame = new JFrame("Text Server");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setUndecorated(true);
  frame.getRootPane()
  .setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
  panel = new JPanel();
  panel.setLayout(null);
  area = new JTextArea();
  area.setEditable(false);
  button1 = new JButton("Start");
  button1.setBounds(210, 10, 75, 40);
  button1.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent ae){
  thread1 = new StartThread(u);
  }
  });
  panel.add(button1);
  button2 = new JButton("Stop");
  button2.setBounds(300, 10, 75, 40);
  button2.addActionListener(new ActionListener(){
  public void actionPerformed (ActionEvent ae){
  thread1.thread.interrupted();
  thread1.socket.close();
  area.append("Server is stopped\n");
  button1.setEnabled(true);
  button2.setEnabled(false);
  }
  });
  button2.setEnabled(false);
  panel.add(button2);
  pane = new JScrollPane(area);
  pane.setBounds(10, 60, 365, 250);
  panel.add(pane);
  frame.add(panel);
  frame.setSize(400, 400);
  frame.setVisible(true);
  }
}

这是第一个类,这是第二堂课。

package Server;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class StartThread implements Runnable{

    DatagramSocket socket;
    private final UDPServer myserv;
    Thread thread;
    StartThread(UDPServer server){
        myserv = server;
        thread = new Thread(this);
        thread.start();
        myserv.button1.setEnabled(false);
        myserv.button2.setEnabled(true);
        }

    public void run(){
        try{
            byte[] buffer = new byte[1024];
            int port = 8080;
            try{
                socket = new DatagramSocket(port);
                while(true){
                    try{
                        myserv.area.append("Server is started\n");
                        //Receive request from client
                        DatagramPacket packet = 
                            new DatagramPacket(buffer, buffer.length );
                        socket.receive(packet);
                        InetAddress client = packet.getAddress();
                            int client_port = packet.getPort();
                            myserv.area.append(" Received "
                                    +new String(buffer)+" from "+client);

                    }
                    catch(UnknownHostException ue){}
                }
            }
            catch(java.net.BindException b){}
        }
        catch (IOException e){
            System.err.println(e);
        }
    }
}

最佳答案

这是一些丑陋的代码。

对于初学者,我会将 UDPServer 设为一个单独的类。

这是你的问题:

你的类有一个私有(private)成员变量u:

UDPServer u;

您没有初始化它,因此引用设置为 null。

您的 main 方法声明了一个相同类型的局部变量 u

两者完全无关。您正在查看“new UPDServer”并想象您正在初始化私有(private)成员变量。这就是让你感到困惑的地方。

在构造函数中初始化UDPServer成员变量。

一旦你这样做了,你就会遇到另一个问题:它在静态上下文中无法被引用。听起来你的下一个问题都在排队......

关于Java不会改变变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7787581/

相关文章:

java - 如何使用德摩根法java重构if语句

java - 上传到服务器后只有一个getter在页面上工作

java.lang.StackOverflowError : null when serializing an object using gson

java - java线程间通信

JAVA将对象添加到不同类的ArrayList,不断替换0索引并且不会变大

Java反射,对象有什么类?

java - Findbugs 可能误报?

Java Webstart 报告错误的 Bootloader 选项

java - 如何在 Java 中淡入淡出 .wav 文件?

java - 如何以编程方式终止liferay中的 session /注销其他用户