Новое в Java: контроль ошибок конструктора - PullRequest
2 голосов
/ 05 ноября 2011

Я новичок в 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 Ответ

1 голос
/ 05 ноября 2011

Я бы не стал беспокоиться об исключениях, 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));
    }

Так как это было принято в качестве ответа, я редактирую его так, как Роланд (в комментариях), совершенно правильно, и я бы не подошелпроблема.

 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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...