gpt4 book ai didi

java - Java套接字,创建自己的通用方法//恶性循环

转载 作者:行者123 更新时间:2023-12-02 11:08:53 27 4
gpt4 key购买 nike

能否请您帮我一个答案?
我已经阅读了很多,但是可以理解如何组织代码。
我想创建自己的方法来使用网络,并在程序中不时调用它。
但是这个编译错误让我很生气:

变量可能尚未初始化

我确实知道为什么,但是我看不到解决方法((
我的愿景是只打开Socket和相关流一次,并在需要时关闭它。

public static void socket_r (String action, String ip_addr, String to_write, int port)  throws IOException {    

String s;

switch (action) {

case "Create": Socket socket = new Socket (ip_addr, port);
OutputStream out_from_socket = socket.getOutputStream();
PrintWriter writer_socket = new PrintWriter(out_from_socket, true);

InputStream input_socket = socket.getInputStream();
BufferedReader reader_socket = new BufferedReader(new InputStreamReader(input_socket));

break;

case "Write": writer_socket.println(to_write);
writer_socket.println();

break;

case "Read": while ((s = reader_socket.readLine()) != null) System.out.println(s);

break;

case "Close": writer_socket.println(to_write);
writer_socket.println();
writer_socket.close();
reader_socket.close();
break;
}

}

最佳答案

让我们从代码为什么不能编译开始...

变量reader_socketwriter_socket是局部变量。这意味着:

  • 必须先明确分配它们,然后才能使用它们,
  • 它们消失了……以及它们各自的值……当您的socket_r方法返回给调用者时。

  • 在您的代码中,有很多地方使用 reader_socketwriter_socket而不明确分配它们。例如:
        writer_socket.println(to_write);

    调用 socket_r可以到达该语句,而无需传递任何为 writer_socket赋值的语句。 (是的,看一下。)

    但这就是问题所在。您的设计要求 socket_r("write", ...)调用使用仅在 socket_r("create", ...)调用中初始化的状态。然后它被扔掉了。

    基本上,您 不能使用状态的局部变量来实现该设计。

    那么解决方案是什么?

    为了“善”
  • 在封闭的类中使变量static变量。 (这是一个不好的解决方案,但是它对您现有代码的更改最少。为什么不好?是……阅读更多有关OO的知识,以及为什么不应该使用static。)
  • 使方法成为非静态方法,并使变量实例变量。
  • 解决方案2并为每个“操作”用单独的方法替换socket_r
  • 解决方案3并添加一些额外的逻辑来为套接字强制执行适当的“生命周期”;即在读取和写入之前创建,在关闭之后不读取或写入,等等。

  • 基本上,您需要重新考虑您的设计以OO方式进行操作,这将使整个过程变得容易得多。

    关于java - Java套接字,创建自己的通用方法//恶性循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957925/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com