【问题标题】:Java: Wrap code with a try catch block function?Java:用 try catch 块函数包装代码?
【发布时间】:2016-02-18 05:20:19
【问题描述】:

我有几个函数可以将对象转换为显式类型。

问题是,创建此对象时,类型可能与我要转换的类型不匹配。沿着这条线的某个地方发生了一些转换。但是,代码可能永远不会达到这些转换。事实并非如此。

因此,当代码到达将发生强制转换的点时,我需要做的就是将该部分放入 try catch 块中。事实上,我什至不需要以任何特殊方式处理异常。

但是我有很多这样的功能。我想知道是否有某种方法可以用 try catch 块包装代码行,而无需实际写出 try catch 块。如果我可以调用一些函数,它将如何自动执行。

try 
{ 
    // cast something 
} 
catch( ClassCastException e ) 
{ 
}

相反,我想调用一个将 try catch 块放在 // cast something 周围的方法。有没有办法做这样的事情?

注意:当我捕获 ClassCastException 时,我什么都不做。如果我不能正确地转换对象也没关系,但我需要捕获异常以便代码执行不会跳转到其他地方。

【问题讨论】:

标签: java casting


【解决方案1】:

您可以编写这样的方法来为您进行转换,同时忽略任何ClassCastException

public static <I, O> O cast(I input, Class<O> outClass) {
    try {
        return outClass.cast(input);
    } catch (ClassCastException e) {
        return null;
    }
}

你可以这样使用它:

Number n = new Integer(1);
Integer i = cast(n, Integer.class);

但你也可以改进代码以避免异常:

public static <I, O> O cast(I input, Class<O> outClass) {
    if(outClass.isAssignableFrom(input.getClass())) {
        return outClass.cast(input); 
    } else {
        return null;
    }
}

【讨论】:

  • 这行得通。是否也可以投射对象数组?如何将数组作为参数传递?例如,如何将 Integer.class 更改为 Integers 数组?
  • 是的,它是Integer[] i = new Integer[2]; Number[] n = cast(i, Number[].class);
【解决方案2】:

不是真的,因为这没有任何意义。如果捕获异常时无需执行任何操作,则根本不要调用该操作并删除之后的所有代码。如果操作成功或失败无关紧要,那么首先不要调用它。

更严重的是 - 咳咳,那严重的 - 你可以捕获异常并让调用者处理它。

【讨论】:

  • 我存储了其他数据,除非我发现异常,否则这些数据不会返回。我进行转换的部分只是我最终返回的数据类的一部分。
【解决方案3】:

尝试为您创建一个通用方法casting

private MyTypeOfObject cast (Object obj) {

    try {

       // your casting code
       return newObj;

    } catch (ClassCastException ee) {
          // log and ignore
          return null; // ????
    }

}

【讨论】:

  • 你在“catch”块中返回了什么?
  • 基于 OP 问题,如果他遇到 CCE,我无法弄清楚他会做什么。也许返回null 就可以了。
  • 那么选项是 1) 空检查而不是 try/catch 或 2) 抛出 NPE 而不是 CCE。我知道我很苛刻,但在我看来,这种方法并不能解决问题。
  • 点了。但在我看来,这里的问题是how can I avoid duplicating common code。答案是在一定程度上使用通用方法。
【解决方案4】:

我对此一无所知(除了@Scary_Wombat 所说的),但如果我站在你的立场上,我会编写一个简单的代码生成器来使用诸如Freemarker 之类的模板引擎来处理这些重复/样板案例或者更高级的东西,比如Antlr。每个地方都有关于这个地方的教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    相关资源
    最近更新 更多