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

时间:2018-06-20 22:27:39

标签: java compiler-errors initialization switch-statement case-statement

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

变量可能尚未初始化

我确实理解为什么,但是看不到解决方法(( 我的愿景是只打开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;
                }               

}

1 个答案:

答案 0 :(得分:1)

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

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

  1. 必须先明确分配它们,然后才能使用它们,并且
  2. socket_r方法返回给调用方时,它们以及它们各自的值会消失。

在您的代码中,有很多地方使用reader_socketwriter_socket而不被明确分配。例如:

    writer_socket.println(to_write);

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

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

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

那该怎么办?

以“善良”顺序

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

基本上,您需要重新考虑您的设计,以便以一种面向对象的方式进行操作,这将使工作变得更加容易。