SONAR выпуск "main" не должен ничего "выбрасывать" JAVA 7

У нас есть этот код. SONAR жалуется на функцию main(). "главное" не должно ничего "бросать"

У основного метода нет причин бросать что-либо. В конце концов, что собирается поймать это? Вместо этого метод должен сам изящно обрабатывать любые исключения, которые могут на него накапливаться, прикреплять как можно больше контекстной информации и выполнять любые необходимые операции регистрации или взаимодействия с пользователем.

Q: Будет ли добавление улова (IOException e) {} смягчить эту проблему?

public class EncryptionHelper {

    private static final int NO_OF_ARGUMENTS = 3;

    /**
     * Ctor
     */
    protected EncryptionHelper() {
        // Empty Ctor
    }

    /**
     * Main
     * 
     * @param args
     * 
     *            0 - Input text to be encrypted or decrypted 
     *            1 - Encrypt/Decrypt [0-Encrypt, 1-Decrypt]
     *            2 - File to write the output
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        if (args.length != NO_OF_ARGUMENTS) {
            throw new IllegalArgumentException("Expected 3 arguments to encrypt/decrypt.");
        }
        OutputStreamWriter fw = null;
        Crypto crypto = CryptoFactory.getCrypto(CryptoType.KBE);
        String en = "";
        if ("0".equals(args[1])) {
            en = crypto.encryptString(args[0]);
        } else {
            en = crypto.decryptString(args[0]);
        }
        try {
            fw = new OutputStreamWriter(new FileOutputStream(args[2]), Charset.forName("UTF-8"));
            fw.write(en);
        } finally {
            if (fw != null) {
                fw.close();
            }

        }
    }
}

2 ответа

Короче да. Добавление catch заблокировать и удалить throws IOException от подписи будет препятствовать тому, чтобы проблема была поднята. Но, как отмечает Надь Вильмос, это не решает проблему. Поскольку это консольное приложение, вы должны использовать catch возможность проинформировать пользователя о проблеме. Да, исключение исключения у пользователя (через throws IOException), но для этого нужно очень мало усилий (через catch и ведение журнала, как рекомендуется в описании правила).

Будет ли добавление улова (IOException e) {} смягчить эту проблему?

Нет! Я думаю, что это худшее из доступных решений. Кстати, если вы напишите это, Sonar будет жаловаться на пустой блок catch - так что одна проблема решена, и одна новая проблема будет результатом.

Это скорее ошибка дизайна.

Подумайте о Microsoft Word или LibreOffice, когда вы хотите открыть файл, который не существует. (Например, вы пишете в открытом диалоге: notExistingFile.doc и нажмите Enter). Если нет файла, называется notExistingFile.doc, это вызывает какое-то исключение (в зависимости от языка программирования / структуры, которые они используют).

Но вместо того, чтобы аварийно завершить работу приложения и выдать это исключение, они справляются с ситуацией - всплывающее окно информирует вас о несуществующем файле.

Если это тестовое приложение или какой-то частный проект, в котором вы на 100% уверены, что файл существует, я бы ничего не сделал. Но если это общедоступный проект, вы должны каким-то образом обработать исключение: написать журнал об отсутствующем файле, сообщить пользователю об отсутствующем файле (предложить какое-то решение проблемы) и т. Д.

Если вы хотите, чтобы проблема исчезла, вы должны пометить ее как решенную (или скрыть эту проблему, есть способ для этого). Если вы хотите решить это из кода Java, вы должны написать следующее:

try {
    // some methods that throw IOException
} catch (IOException ignored) {
    // if you call your variable ignored, Sonar won't complain about it
    // but you should provide some information about this, why did you ignore that exception
    // for developers looking at this code later.
}
Другие вопросы по тегам