尝试并在java中捕获语句?

时间:2009-12-14 16:14:33

标签: java exception-handling

如何使用try和catch语句而不是方法头中的throws子句重写以下方法:

public String getInput(String filename) throws Exception
{
    BufferedReader infile = new BufferedReader (new FileReader(filename));
    String response = infile.readLine();
    infile.close();

    return response:
}

6 个答案:

答案 0 :(得分:9)

Try和catch用于优雅地处理异常,而不是隐藏异常。如果你正在调用getinput(),你不想知道出了什么问题吗?如果你想隐藏它,我想你可以做类似的事情

public String getInput(String file) {
    StringBuilder ret = new StringBuilder();
    String buf;
    BufferedReader inFile = null;

    try {
        inFile = new BufferedReader(new FileReader(filename));
        while (buf = inFile.readLine())
            ret.append(buf);
    } catch (FileNotFoundException e) {
        ret.append("Couldn't find " + file);
    } catch (IOException e) {
        ret.append("There was an error reading the file.");
    } finally {
        if (inFile != null) {
           try {
              inFile.close();
           } catch (IOException aargh) {
              // TODO do something (or nothing)
           }
        }
    }

    return ret.toString();
}

值得注意的是,您希望单独捕获异常。盲目地抓住Exception正如一些答案所暗示的那样是一个坏主意。你不想抓住你从未见过的东西来处理你所做的事情。如果你想捕获你从未见过的异常​​,你需要记录它并优雅地向用户显示错误。

答案 1 :(得分:4)

这是异常处理策略的一个很好的SO线程:

Critique my exception handling strategy

其他一些想法:

  1. 小心捕捉并隐藏它们。在这种情况下,我会说使用“抛出”实际上更好,因为你告诉调用者你的方法出了什么问题而且你无法跟上讨价还价的结束(返回有效的回复)。虽然我会说“抛出IOException”而不仅仅是简单的旧“异常”。如果你打算去捕捉异常,做一些有建设性的事情,不要只是抓住它来抓住它。

  2. 当您处理文件I / O并在finally子句中关闭文件时,您可能希望使用try / catch / finally。

  3. 就代码而言,请查看@Pablo Santa Cruz并阅读评论。我的代码非常相似。

答案 2 :(得分:2)

public String getInput(String filename)
{
    BufferedReader infile = null;
    try {
       infile = new BufferedReader (new FileReader(filename));
       String response = infile.readLine();
       return response;
    } catch (IOException e) {
       // handle exception here
    } finally {
       try { infile.close(); } catch (IOException e) { }
    }
    return null;
}

答案 3 :(得分:0)

这样的事情应该这样做:

public String getinput(String filename) 
{
    BufferedReader infile = null;
    String response = null;
    try {
        infile = new BufferedReader(new FileReader(filename));
        response = infile.readLine();
    } catch (IOException e) {
        //handle exception
    } finally {
        try {
            if (infile != null)
              infile.close();
        } catch (IOException e) {
            //handle exception
        }
    }
    return response;
}

请注意,您应该按照其他人的说明添加finally子句,因为如果BufferedReader未正确关闭,您可能会因为异常而最终收到memleaks。

答案 4 :(得分:0)

我会这样写:

public String getInput(String filename) {
    BufferedReader infile = null;
    String response = "";
    try { 
        infile = new BufferedReader (new FileReader(filename));
        response = infile.readLine();
    } catch( IOException ioe ) {
        System.err.printf("Exception trying to read: %s. IOException.getMessage(): %s",
                           filename, ioe.getMessage() );
    } finally {
        if( infile != null ) try {
            infile.close();
        } catch( IOException ioe ){}
    }
    return response;
}

在这种特殊情况下,如果抛出异常,空字符串""对我有好处。这并非总是如此。

答案 5 :(得分:0)

这是对jcms回答的改编 - 这是因为我不喜欢他的解决方案中的异常处理......

我们必须决定在发生异常时该怎么做。这通常包含在一些要求中。记录是一个好主意,但我们仍然需要做点什么。至少我从不使用返回值来报告文件内容以及错误消息。对接收器进行解码非常困难。如果丢失文件或IO错误是特殊情况,可以抛出异常 - 通常的方式。或者,这是我的建议,我们定义一个小类来返回文件内容和错误状态:

public class FileContent {
  private String fileContent = null;
  private Throwable error = null;

  public FileContent(String fileContent, Throwable error) {
    this.error = error;
    this.fileContent = fileContent;      
  }

  // getters for all fields (no setters!)

  public boolean isValid() {
    return (error == null);
  }
}

并且getInput()方法将如下所示:

public FileContent getInput(final String fileName) {
    final StringBuilder fileContentBuilder = new StringBuilder();
    String buffer = null;
    BufferedReader reader = null;
    Throwable error = null;

    try {
        reader = new BufferedReader(new FileReader(fileName));
        while (buffer = reader.readLine()) {
            fileContentBuilder.append(buffer);
        }
    } catch (FileNotFoundException e) {
        error = new RuntimeException("Couldn't find " + fileName, e);
    } catch (IOException e) {
        error = new RuntimeException("There was an error reading the file.", e);
    } finally {
        if (inFile != null) {
           try {
              inFile.close();
           } catch (IOException e) {
              error = new RuntimeException(
                         "Couldn't close reader for file " + fileName, e);
           }
        }
    }

    return new FileContent(fileContentBuilder.toString(), error);
}

public void useGetInput() {
   FileContent content = getInput("your/path/to/your/file");
   if (content.isValid()) {
     System.out.println(content.getFileContent());
   } else {
     content.getError().printStackTrace();
   }
}

(改进;而不是使用RuntimeException作为包装器,我们可以定义自己的异常类型)