2013-11-15 129 views
-2

这是发生这种事的堰,因为就我所见,一切都是正确的。如果你能帮助我,我会感谢 下面的代码:为什么我得到这个“未报告的异常”?

import java.io.*; 
import java.net.*; 
import java.util.*; 
import javax.swing.*; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.ResultSet; 
import java.sql.Statement; 

public class Server{ 

private static HashSet<String> users = new HashSet<String>(); 
//private static HashSet<String> passwords = new HashSet<String>(); 
private static HashSet<PrintWriter> writers = new HashSet<PrintWriter>(); 
private static final int port = 9001; 

private static class SocketHandler extends Thread{ 

    PrintWriter output; 
    BufferedReader input; 
    String name; 
    //String pass; 
    Socket socket; 

    public SocketHandler(Socket sc){ 
     this.socket = sc; 
    } 

    public void run(){ 

    input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     output = new PrintWriter(socket.getOutputStream(), true); 

     try{ 

      while(true){ 

       output.println("SUBMITNAME"); 
       name = input.readLine(); 
       if(name == null){ 
        return; 
       } 
       synchronized(users){ 
        if(!users.contains(name)){ 
         users.add(name); 
         break; 
        } 
       } 
      } 

      output.println("NAMEACCEPTED"); 
      writers.add(output); 

      while(true){ 

       String in = input.readLine(); 
       if(in == null){ 
        return; 
       } 
       for(PrintWriter writer : writers){ 
        writer.println("MESSAGE: " + name + ": " + in); 
       } 
      } 

     }catch(IOException e){ 
      System.out.println(e); 
     }finally{ 

      if(name != null){ 
       users.remove(name); 
      } 
      if(output != null){ 
       writers.remove(output); 
      } 
      try{ 
       socket.close(); 

      }catch(IOException e){ 
       System.out.println(e); 
      } 

     } 
    } 
} 

public static void main(String[]args) throws Exception{ 

    ServerSocket listener = new ServerSocket(port); 
    System.out.println("The server is now running..."); 

    try{ 

     while(true){ 
      new SocketHandler(listener.accept()).start(); 
     } 

    }catch(IOException e){ 
     System.out.println(e); 
    }finally{ 
     listener.close(); 
    } 

    Connection con = null; 
    ResultSet rs = null; 
    Statement s = null; 

    try{ 

     Class.forName("org.sqlite.JDBC"); 
con = DriverManager.getConnection("jdbc:sqlite:/home/julio/Documents/Prueba.db"); 
     s = con.createStatement(); 
     rs = s.executeQuery("E-MAIL DATABASE"); 
     while(rs.next()){ 

    System.out.println("Enter your email adress: " + rs.getString("name")); 

     } 

    }catch(Exception e){ 
     e.printStackTrace(); 
    }finally{ 
     try{ 
      rs.close(); 
      s.close(); 
      con.close(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

}

我不知道为什么会出现这种情况,如果你可以在代码中看到的,我扔了,并抓住每一个异常..

This is the error that displays on screen

这是错误的屏幕显示

+2

'IOException异常:必须捕获或宣布为thrown.'还有什么不明白吗?在'try'块中移动你的语句。 –

+0

可能的重复[Unreported exception java.sql.SQLException;必须被捕获或声明为抛出?](http://stackoverflow.com/questions/4457352/unreported-exception-java-sql-sqlexception-must-be-caught-or-declared-to-be-thr) –

回答

1

检查两条线,其中这些埃罗rs发生:它们在try块之外。

input = new BufferedReader(new InputStreamReader(socket.getInputStream())); // error 1: not in the try block! 
output = new PrintWriter(socket.getOutputStream(), true); // error 2: not in the try block! 

try { 

    // ... other code ... 

} catch(IOException e) { 
    System.out.println(e); 
} finally { 

    if (name != null) { 
     users.remove(name); 
    } 
    if (output != null) { 
     writers.remove(output); 
    } 
    try { 
     socket.close(); 

    } catch (IOException e) { 
     System.out.println(e); 
    } 

} 

您应该将作业放在try区块的内部。

0

在try块内部分配输入和输出。

public void run(){ 
    try{ 
     input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     output = new PrintWriter(socket.getOutputStream(), true); 

     .... 

} 

}

+0

类字段默认初始化为“空”(如果它们是对象引用)。如果它们是局部变量,则只需要初始化它们。 –

+0

@RobinKrahl谢谢你,你是对的。我已经纠正了答案。 – holap

相关问题