SONAR问题“主要”不应该“抛出”任何东西JAVA 7

时间:2016-01-20 19:28:49

标签: java exception-handling sonarqube main throws

我们有这个代码。 SONAR抱怨main()函数。 “main”不应该“抛出”任何东西

主要方法没有理由抛出任何东西。毕竟,会有什么关系呢? 相反,该方法本身应该优雅地处理可能冒泡到它的任何异常,附加尽可能多的上下文信息,并执行任何必要的日志记录或用户通信。

问:添加catch(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 个答案:

答案 0 :(得分:1)

  

添加一个catch(IOException e){}会缓解这个问题吗?

没有!我认为,这是最糟糕的解决方案。顺便说一句,如果你写这个,Sonar会抱怨空的阻塞 - 所以一个问题就解决了,结果会出现一个新问题。

这更像是设计错误。

当您要打开不存在的文件时,请考虑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.
}

答案 1 :(得分:1)

简而言之,是的。添加fstream LogFile("TempFile.txt", std::ios_base::binary | std::ios_base::out | std::ios_base::in); LogFile.seekp(10, ios::beg); LogFile.write("abc", 4); 块并从签名中删除catch可以防止引发该问题。但正如Nagy Vilmos指出的那样,这并没有真正解决问题。因为这是一个控制台应用程序,所以您应该使用throws IOException机会通知用户该问题。是的,向用户(通过catch)解决异常是这样做的,但是根据规则说明的推荐,通过throws IOException和日志记录完成这项工作需要花费很少的精力。