【问题标题】:Why is the code asking to catch IOException为什么代码要求捕获 IOException
【发布时间】:2018-09-08 08:07:23
【问题描述】:

我正在使用 try catch 编写程序,但代码要求使用 try-catch 包围 InputStreamReader 和 BufferedReader 以捕获 IOException 或使用 throws 声明 IOException。但是为什么当我对 IOException 使用 catch 时它会要求这样做。

代码如下:

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

}

【问题讨论】:

  • .close() 方法也会抛出 IOException 而你没有处理它们
  • 提示:使用try-with-resources
  • br.close()r.close() 都可以抛出 IOExceptions,finally 不是代码的 try-catch 部分的一部分,因此它们不会被包含在内,您必须分别处理。事实上,Java 现在包含一项功能可以为您执行此操作,请参阅The try-with-resources Statement 了解更多详情

标签: java exception-handling


【解决方案1】:

finally 阻止close() 调用也可以抛出IOException。所以编译器会抱怨,因为IOExceptionChecked 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);
    }
    

【讨论】:

  • 但如果我使用 Scanner 而不是 BufferedReader,那么在 finally 块 close() 方法中不会要求捕获 IOException。为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2019-10-29
  • 2012-03-18
相关资源
最近更新 更多