Почему код просит перехватить IOException - PullRequest
0 голосов
/ 08 сентября 2018

Я пишу программу, используя try catch, но код просит окружить InputStreamReader и BufferedReader try-catch, чтобы перехватить IOException или объявить IOException с помощью throws.Но почему он запрашивает это, когда я использую catch для IOException.

Вот код:

public class BufferedReader3 {


    public static void main(String[] args)  {
        // TODO Auto-generated method stub

        InputStreamReader  r=null;
        BufferedReader br=null;
        String name="";    





        try 
        {
            r =new InputStreamReader(System.in);    
            br =new BufferedReader(r); 

            while(!name.equals("stop"))
            {    

                System.out.println("Enter data: ");   
                name=br.readLine();
            } 



            System.out.println("data is: "+name);    


        }              
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        catch (Exception e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

        finally
        {

            br.close();    
            r.close();    
        }
    }

}

1 Ответ

0 голосов
/ 08 сентября 2018

в finally блоке close() звонки также могут выбрасывать IOException. Таким образом, компилятор жалуется на это, поскольку IOException имеет тип Checked Exception, вы должны также обработать этот случай.

давайте попробуем разобраться с этим;

  1. использовать try with resources

    String name = "";
    try ( InputStreamReader r = new InputStreamReader(System.in); 
          BufferedReader br = new BufferedReader(r); ){
    
        while (!name.equals("stop")) {
            System.out.println("Enter data: ");
            name = br.readLine();
        }
        System.out.println("data is: " + name);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    
  2. другой try catch блок в finally

    InputStreamReader r = null;
    BufferedReader br = null;
    String name = "";
    
    try {
        r = new InputStreamReader(System.in);
        br = new BufferedReader(r);
        while (!name.equals("stop")) {
            System.out.println("Enter data: ");
            name = br.readLine();
        }
    
        System.out.println("data is: " + name);
    
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    finally {
        try {
            br.close();
            r.close();
        } catch (IOException e2) {
            e2.printStackTrace();
        }
    }
    
  3. использовать устаревшие org.apache.commons.io.IOUtils.closeQuietly(Closeable ...)

    InputStreamReader r = null;
    BufferedReader br = null;
    String name = "";
    
    try {
        r = new InputStreamReader(System.in);
        br = new BufferedReader(r);
        while (!name.equals("stop")) {
            System.out.println("Enter data: ");
            name = br.readLine();
        }
    
        System.out.println("data is: " + name);
    
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    finally {
        IOUtils.closeQuietly(br, r);
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...