我们有这个代码。 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();
}
}
}
}
答案 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
和日志记录完成这项工作需要花费很少的精力。/ p>