《Effective Java 第三版》——第二章 创建和销毁对象
《Effective Java 第三版》——第三章 所有对象都通用的方法
《Effective Java 第三版》——第四章 类和接口
受检异常和非受检异常上面两个例子中,ArithmeticException与IOException都是来自Exception体系,为什么一个不需要处理,一个需要处理呢?这就涉及到两个概念:受检异常和非受检异常。 先来复习一下Java异常体系:
两者的代表人物出场(掌声有请~~):
如何处理异常既然两者的概念清晰了,处理方式也随之昭然若揭。 针对受检异常:
针对非受检异常:
自定义异常以上是打基础,下面玩点高级的。
一般情况下,异常类提供了默认构造器和一个带有String类型参数的构造器。我们的自定义异常,只需要实现这两个构造器就足够用了。因为最有价值的是我们定义的异常类型(即异常的名字),当异常发生时,我们只要看到了这个名字就知道发生了什么。所以除非有一些特殊操作,否则自定义异常只需简单实现构造器即可。 |
|
模拟自类型,之前有解释:
《Effective Java 第三版》——第二章 创建和销毁对象
绕,但看懂了
第32条要深入多轮理解
第33条挺精巧的
meta of meta
比较绕,看例子相对容易明白:
package effectivejava.chapter5.item33; import java.lang.annotation.*; import java.lang.reflect.*; // Use of asSubclass to safely cast to a bounded type token (Page 155) public class PrintAnnotation { static Annotation getAnnotation(AnnotatedElement element, String annotationTypeName) { Class<?> annotationType = null; // Unbounded type token try { annotationType = Class.forName(annotationTypeName); } catch (Exception ex) { throw new IllegalArgumentException(ex); } return element.getAnnotation( annotationType.asSubclass(Annotation.class)); } // Test program to print named annotation of named class public static void main(String[] args) throws Exception { if (args.length != 2) { System.out.println( "Usage: java PrintAnnotation <class> <annotation>"); System.exit(1); } String className = args[0]; String annotationTypeName = args[1]; Class<?> klass = Class.forName(className); System.out.println(getAnnotation(klass, annotationTypeName)); } }
/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Users/didi/git/effective-java-3e-source-code/bin effectivejava.chapter5.item33.PrintAnnotation Usage: java PrintAnnotation <class> <annotation> Process finished with exit code 1