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 受检异常和非受检异常
网上有很多学习资料,但我们要说的是真正编码时,碰到的不同

同样是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是没有意义的,只处理受检异常即可。
网友评论