能否请您帮我一个答案? 我已经阅读了很多,但是可以理解如何组织代码。 我想创建自己的方法来使用网络,并在程序中不时调用它。 但是这个编译错误使我发疯:
变量可能尚未初始化
我确实理解为什么,但是看不到解决方法(( 我的愿景是只打开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;
}
}
答案 0 :(得分:1)
让我们从代码为什么不能编译开始...
变量reader_socket
和writer_socket
是局部变量。这意味着:
socket_r
方法返回给调用方时,它们以及它们各自的值会消失。在您的代码中,有很多地方使用reader_socket
和writer_socket
而不被明确分配。例如:
writer_socket.println(to_write);
对socket_r
的调用可以到达该语句,而无需传递任何为writer_socket
赋值的语句。 (是的,看着它。)
但这是问题所在。您的 design 设计要求socket_r("write", ...)
调用使用仅在socket_r("create", ...)
调用中初始化的状态。然后它被扔掉了。
基本上,您不能使用状态的局部变量来实现该设计。
那该怎么办?
以“善良”顺序
static
成为封闭类中的变量。 (这是一个很糟糕的解决方案,但是它对您现有代码的更改最少。为什么不好?是……阅读更多有关OO的知识,以及为什么static
应该很少使用。)socket_r
。基本上,您需要重新考虑您的设计,以便以一种面向对象的方式进行操作,这将使工作变得更加容易。