Java跳过try catch for throwable fuction

时间:2015-11-26 11:17:00

标签: java exception try-catch

我想知道Java中是否有办法跳过'跳过'我知道抛出函数的try-catch方法不会引发异常。

我有这段代码:

#pragma strict
    // random url link from google
    // and DXT compress them at runtime
    var url = "https://i.ytimg.com/vi/yaqe1qesQ8c/maxresdefault.jpg";

    function Start () {
        // Create a texture in DXT1 format
        GetComponent.<Renderer>().material.mainTexture = new Texture2D(4, 4, TextureFormat.DXT1, false);
        while(true) {
            // Start a download of the given URL
            var www = new WWW(url);

            // wait until the download is done
            yield www;

            var Texture_1: Texture2D;
            Texture_1 = Resources.Load("glass");

            // assign the downloaded image to the main texture of the object
            www.LoadImageIntoTexture(Texture_1);
        }
    }

我收到编译错误,说明未处理异常

  

错误:(97,30)错误:未报告的异常ParseException;必须被抓住或宣布被抛出

我可以通过将DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); Date date = format.parse(dateString); // <-- Compiler error here Log.i(PF.TAG, date.toString()); 置于try-catch中来消除此错误。

在Swift 2错误处理中,有一个选项可以执行format.parse(),它将编译并执行throwable函数,并在出现错误时崩溃。

在Java中是否有类似的方式,所以我不必把我知道的所有小任务放在一个try-catch的地方不会抛出异常?

3 个答案:

答案 0 :(得分:1)

不是真的,但你可以编写一个帮助器方法来欺骗编译器,使其相信未检查已检查的异常。例如:

public static <T> T uncheck(Callable<T> callable) {
  try {
    return callable.call();
  } catch (Throwable t) {
    return rethrow(t);
  }
}

@SuppressWarnings("unchecked")
private static <E extends Throwable, T> T rethrow(Throwable t) throws E {
  throw (E) t;
}

你会像这样使用它:

Date date = uncheck(() -> format.parse(dateString));

您还可以将已检查的异常包装到未经检查的异常中,例如jOOL执行here

答案 1 :(得分:0)

不是。

在Java中,通常有两种类型的异常 - checked(扩展异常)或unchecked(扩展RuntimeException)。

以某种方式处理已检查的异常是强制性的,不这样做会导致编译时异常,就像您的情况一样。有两种处理方式:

  • 尝试 - 捕获块。如果需要,可以通过提供一个空的catch子句和一个有用的注释来忽略,指出为什么不应该这样做。
    • throws声明。它是方法声明的一部分,并将处理异常的责任转移到声明方法的客户端。

如果你想模仿你提到的Swift构造,你需要的是这样的东西:

try {
    someFunction()
} catch (Exception e) {
    throw new <some runtime exception>
}

通过这种方式,你可以吞下&#34;已检查的异常,停止它的传播,而是抛出一个未经检查的运行时异常,它不会强制调用者处理它,如果发生原始异常,将导致崩溃。

答案 2 :(得分:0)

您可以避免在某些时候处理该异常,因为它已经过检查,但如果您重构调用,可以避免需要大量的try-catch构造处理异常的单独方法:

public class DateUtils {

    private DateUtils() { throw new AssertionError(); }

    public static Date parse(String toParse, DateFormat format) {
        try {
            return format.parse(toParse);
        catch (ParseException e) {
            // Exception handling code here. Maybe you want to log the error
            // somewhere? Then either re-throw as a RuntimeException or return some
            // default value.
        }
    }
}

然后你做:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = DateUtils.parse(dateString, format);
Log.i(PF.TAG, date.toString());