关于java异常你可能忽略了这些

2019-02-14  本文已影响1人  sollian

1 OOM可以被捕获

程序发生Error,通常认为是不可控的,但有时也可以对Error进行一定的处理,比如android源码中,View的处理:

            try {
                bitmap = Bitmap.createBitmap(mResources.getDisplayMetrics(),
                        width, height, quality);
                bitmap.setDensity(getResources().getDisplayMetrics().densityDpi);
                if (autoScale) {
                    mDrawingCache = bitmap;
                } else {
                    mUnscaledDrawingCache = bitmap;
                }
                if (opaque && use32BitCache) bitmap.setHasAlpha(false);
            } catch (OutOfMemoryError e) {
                // If there is not enough memory to create the bitmap cache, just
                // ignore the issue as bitmap caches are not required to draw the
                // view hierarchy
                if (autoScale) {
                    mDrawingCache = null;
                } else {
                    mUnscaledDrawingCache = null;
                }
                mCachingFailed = true;
                return;
            }

2 受检异常和非受检异常

网上有很多学习资料,但我们要说的是真正编码时,碰到的不同

图1

同样是throw语句,第一个出现了编译错误,鼠标放上去,会提示Unhandled exception:java.lang.Throwable;第二个却没有问题。原因就在于RuntimeException及其子类是非受检异常,可以直接抛出,其他类型为受检异常,必须做相应处理,这里通过RuntimeException进行了包装。
打印的堆栈信息如下:

Exception in thread "main" java.lang.RuntimeException: java.lang.Throwable: 我是谁
    at com.sollian.sourcestudy.JavaTest.main(JavaTest.java:12)
Caused by: java.lang.Throwable: 我是谁
    at com.sollian.sourcestudy.JavaTest.main(JavaTest.java:11)

明白了上述区别,那以后自定义异常时,是继承自Exception还是RuntimeException,应该就有自己的判断了。如果必须要求处理,就继承Exception,否则继承RuntimeException。

3 throw throws是两个关键字

    public void get() throws TimeoutException {
        throw new TimeoutException("");
    }

throws关键字后跟RuntimeException是没有意义的,只处理受检异常即可。

上一篇 下一篇

猜你喜欢

热点阅读