Java新手:构造函数错误控制

时间:2011-11-05 06:04:39

标签: java exception-handling parameters error-handling constructor

我是Java的新手,我将我的一个C ++库移植到Java作为学习实验。这不是家庭作业(从我的代码看起来应该很明显)。关于ESRI形状文件阅读器的构造函数的以下代码,我有几个问题。

import java.io.*;

/**
 *
 * @author Bill
 */
public class ShapeFileReader {
    public FileInputStream inStream;
    /*
     * @param fileName File name string. Must not be null or zero length.
     * @throws Exception if file specified by fileName fails to open
     */
    public ShapeFileReader(String fileName) throws IOException {
        if(fileName == null)
            throw new NullPointerException("fileName was null");

        if(fileName.length() == 0)
            throw new IllegalArgumentException("fileName string length was zero");

        File fi = new File(fileName);
        if(fi.exists() == false)
            throw new IOException("File does not exist: " + fileName);

        // Catch-or-specify (this method already throws IOException)
        inStream = new FileInputStream(fileName);
    }
}

在参数验证和存在期间,我应该抛出如图所示的异常吗?验证会抛出未经检查的异常,并且存在会抛出已检查的异常。我假设FileInputStream构造函数也会抛出IOException,但我在方法throws子句中指定了它。

我正在考虑将文件的开头重构为单独的函数,但我认为在构造函数中执行此操作会更有用和简单,并且还学习如何在此处控制错误。此外,该对象的任何实例都不具有关闭/打开状态。所有这些对象都严格保留用于仅读取文件,因此它们是根据文件的需要创建的。我将单独提供close()方法。

另外,从可扩展性的角度来看,是否很难适应使用FileInputStream使用当前构造函数通过网络读取文件?或者我应该使用不同的类和多个构造函数吗?

感谢您提供的所有输入。

1 个答案:

答案 0 :(得分:1)

我不打扰异常,FileInputStream会为你抛出异常,你不会在代码中添加除了杂乱之外的任何东西。

要使其与网络协同工作,而不仅仅是您修改的文件:

public class ShapeFileReader {
    private final InputStream inStream;

    public ShapeFileReader(InputStream inStream) {
        this.inStream = inStream;
    }

    /*
     * @param fileName File name string. Must not be null or zero length.
     * @throws Exception if file specified by fileName fails to open
     */
    public ShapeFileReader(String fileName) throws IOException {
        this(new FileInputStream(fileName));
    }

由于这已经被接受为我正在编辑的答案,因为Roland(在评论中)是非常正确的,这不是我如何解决问题。

 public class ShapeReader {
    public static Shape readShape(InputStream inStream) {
        ... do the work
    }

    /*
     * @param fileName File name string. Must not be null or zero length.
     * @throws Exception if file specified by fileName fails to open
     */
    public static Shape readShape(String fileName) throws IOException {
        FileInputStream fis = new FileInputStream(fileName);
        try {
            return readShape(fis);
        } finally {
            fis.close();
        }
    }
}