用if条件替换try-catch块

时间:2015-10-02 09:30:56

标签: java if-statement try-catch

出于代码质量原因,我希望将代码中的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来说会更好。

有什么想法吗?

1 个答案:

答案 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();
}

因此,抛出异常;

  • 给出的架构为空
  • 给定的DataType不是架构类型

您事先知道是否会抛出异常。在你的情况下不是这样你可以安全地忽略异常,因为它永远不会被抛出。您可以删除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字符集。