2013-11-15 3 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

가능한 복제본 [보고되지 않은 예외 java.sql.SQLException; 붙잡혀 있어야하거나 던져 선언해야합니까?] (http://stackoverflow.com/questions/4457352/unreported-exception-java-sql-sqlexception-must-be-caught-or-declared-to-be-thr) –

답변

1

이 곳이 에로 두 줄을 확인하는 오류입니다 발생했습니다 : 그들은 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

클래스 필드는 기본적으로 'null'(객체 참조 인 경우)로 초기화됩니다. 로컬 변수 인 경우에만 초기화해야합니다. –

+0

@RobinKrahl 고마워, 네 말이 맞아. 나는 그 답을 바로 잡았다. – holap

관련 문제