出于代码质量原因,我希望将代码中的try catch
块替换为if
条件,以避免使用FrontendException
。
这是我的代码:
Schema mySchema = new Schema();
mySchema.add(new Schema.FieldSchema("myInteger", DataType.INTEGER));
mySchema.add(new Schema.FieldSchema("myBoolean", DataType.BOOLEAN));
Schema tupleSchema = new Schema();
try {
tupleSchema.add(new Schema.FieldSchema("ARRAY_ELEM", mySchema, DataType.BAG));
} catch (FrontendException e) {
tupleSchema = new Schema(new Schema.FieldSchema(getSchemaName("myClass", input), DataType.DOUBLE));
}
return tupleSchema;
是否可以使用if else
条件替换此代码?这样我就不必使用这种类型的Exception,这对SonarQube来说会更好。
有什么想法吗?
答案 0 :(得分:2)
Schema.FieldSchema
构造函数抛出的异常是确定性的。这是构造函数的代码;
public FieldSchema(String a, Schema s, byte t) throws FrontendException {
alias = a;
schema = s;
log.debug("t: " + t + " Bag: " + DataType.BAG + " tuple: " + DataType.TUPLE);
if ((null != s) && !(DataType.isSchemaType(t))) {
int errCode = 1020;
throw new FrontendException("Only a BAG, TUPLE or MAP can have schemas. Got "
+ DataType.findTypeName(t), errCode, PigException.INPUT);
}
type = t;
canonicalName = CanonicalNamer.getNewName();
}
因此,抛出异常;
您事先知道是否会抛出异常。在你的情况下不是这样你可以安全地忽略异常,因为它永远不会被抛出。您可以删除catch块中的代码。你也可以用;替换它;
throw new IllegalStateException("Summon Cthulhu");
与获得UTF-8
字符集相似的情况;
String test = "abc";
byte[] bytes;
try {
bytes = test.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
//Can never happen although the compiler forces us to catch it
}
虽然如果不支持charset,getBytes方法可以抛出异常,但始终保证支持UTF-8
字符集。