• 《Effective Java 第三版》——第五章 泛型


    《Effective Java 第三版》——第二章 创建和销毁对象

    《Effective Java 第三版》——第三章 所有对象都通用的方法

    《Effective Java 第三版》——第四章 类和接口 

     

     

     

     

    受检异常和非受检异常

    上面两个例子中,ArithmeticException与IOException都是来自Exception体系,为什么一个不需要处理,一个需要处理呢?这就涉及到两个概念:受检异常和非受检异常。 先来复习一下Java异常体系:

    Java异常体系
    • 非受检异常:RuntimeException及其子类。这类异常由程序员逻辑错误导致,应该人为承担责任。Java编译器不要求强制处理,即可以捕获或抛出,也可以不捕获或抛出。
    • 受检异常:非RuntimeException异常。这类异常是由于外部的一些偶然因素引起的。Java编译器要求强制处理,即必须得到捕获或抛出。

    两者的代表人物出场(掌声有请~~):

    • 非受检异常:RuntimeException,ArithmeticException,NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException
    • 受检异常:Exception,IOException,SQLException,FileNotFoundException

    如何处理异常

    既然两者的概念清晰了,处理方式也随之昭然若揭。

    针对受检异常:

    • throws抛出。(这是低端做法)
    • try/catch捕获处理。(推荐之,高端做法)

    针对非受检异常:

    • throws抛出。
    • try/catch捕获处理。
    • 不处理。(这个就厉害了,我才不管程序崩没崩,把锅甩给上帝~~)

    自定义异常

    以上是打基础,下面玩点高级的。

    当需要一些跟特定业务相关的异常信息类时,我们可以在Java自身定义的异常之外,编写继承自Exception的受检异常类,也可以编写继承自RuntimeException或其子类的非受检异常类。

    一般情况下,异常类提供了默认构造器和一个带有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
  • 相关阅读:
    Ubuntu 杂音 alsa*
    安装YouCompleteMe
    vimrc
    Linux Windows 修改键盘映射
    VMware Workstation+Linux+Xshell+Xftp+MySQL+SQLyog 配置
    leetcode Merge Intervals
    leetcode Remove Duplicates from Sorted Array II
    用栈实现二叉树的非递归中序遍历
    nth_element 测试程序
    Windows 程序设计
  • 原文地址:https://www.cnblogs.com/cx2016/p/13265225.html
Copyright © 2020-2023  润新知