Почему я получаю это незарегистрированное исключение?

Странно, что это происходит, потому что, как я вижу, все правильно. Если вы можете мне помочь, я буду благодарен Вот код:

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();
        }
    }
}

}

Я не знаю, почему это происходит, если, как вы можете видеть в коде, я выбрасываю и ловлю каждое исключение.

Эта ошибка отображается на экране

Это ошибка, которая отображается на экране


person Julito Garrido    schedule 15.11.2013    source источник
comment
IOException: must be caught or declared to be thrown. Что тебе непонятно? Переместите свой оператор внутрь блока try.   -  person Sotirios Delimanolis    schedule 15.11.2013


Ответы (2)


Проверьте две строки, в которых возникают эти ошибки: они находятся за пределами блока 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.

person Robin Krahl    schedule 15.11.2013

назначьте ввод и вывод внутри блока try.

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

        ....

}

}

person holap    schedule 15.11.2013
comment
Поля класса инициализируются значением null (если они являются ссылками на объекты) по умолчанию. Вам нужно было бы только инициализировать их, если бы они были локальными переменными. - person Robin Krahl; 15.11.2013