• 《数据结构和Java集合框架》第一章学习笔记


    第一章 java语言的重要特性学习笔记


    一.重要概念

    方法描述提供给用户了解方法的所有信息【前置条件、后置条件、方法标题】
    前置条件:程序在执行方法之前的状态要求
    后置条件:在前置条件为真的前提下,程序执行方法之后的状态要求(前置条件和后置条件由调用对象和形式参数确定)
    数据抽象原则:用户代码无法访问所使用类的实现细节
    契约:如果方法的用户确保在调用方法之前前置条件为真,那么开发者应当保证方法执行完毕时后置条件为真
    开闭原则:每个类应当是开放(通过继承扩展)和关闭的(对现有应用程序是稳定的)
    子类替代法则:当在一个表达式中调用了超类对象的引用变量时,可以利用子类对象的引用变量替代

    二.知识点

    ☺构造函数对类的实例进行初始化。因此,构造函数不会继承。但是,当调用子类的构造函数时,子类的构造函数首先执行从自动调用超类的默认构造函数开始
    ☺如果超类具有一个构造函数,而没有默认构造函数。这时子类的构造函数中第一个语句必须显式地调用超类的构造函数。对超类的构造函数的调用由保留字super加上圆括号中的参数列表组成
    ☺从开发者的观点看,类由字段和对字段进行操作的方法组成。从用户的观点看,类由方法描述组成

    2.1 检查异常与非检查异常

    通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和非检查的异常(unchecked exceptions)。

    一、检查异常(checked exceptions)

    什么是检查异常?

    答:就是编译器要求你必须处置的异常。不知道你编程的时候有没有遇到过,你写的某段代码,编译器要求你必须要对这段代码try...catch,或者throws exception,如果你遇见过,没错,这就是检查异常,也就是说,你代码还没运行呢,编译器就会检查你的代码,会不会出现异常,要求你对可能出现的异常必须做出相应的处理。

    对检查异常(checked exception)的几种处理方式:
    1、继续抛出,消极的方法,一直可以抛到java虚拟机来处理,就是通过throws exception抛出。
    2、用try...catch捕获
    注意,对于检查的异常必须处理,或者必须捕获或者必须抛出

    如何区分什么是检查异常呢?

    除了RuntimeException与其子类,以及错误(Error),其他的都是检查异常(绝对的大家族)。

    二、非检查异常(unchecked exceptions)
    什么是非检查异常?

    答:编译器不要求强制处置的异常,虽然你有可能出现错误,但是我不会在编译的时候检查,没必要,也不可能。为什么呢?你想想非检查异常都有哪些?NullPointerException,IndexOutOfBoundsException,VirtualMachineError等,这些异常你编译的时候检查吗?那我还要不要运行了,等死人啊。再说了,明明可以运行时检查,都在编译的时候检查,你写的代码还能看吗?而且有些异常只能在运行时才能检查出来,比如空指针,堆溢出等。

    对未检查的异常(unchecked exception )的几种处理方式:
    1、捕获
    2、继续抛出
    3、不处理

    一般我们是不处理的,因为你很难判断会出什么问题,而且有些异常你也无法运行时处理,比如空指针,需要人手动的去查找。

    而且,捕捉异常并处理的代价远远大于直接抛出。

    如何区分什么是非检查异常呢?

    RuntimeException与其子类,以及错误(Error)。

    2.2 Exception类层次结构

    三.重要代码

    怎么处理已检查异常

    package com.practice;
    import java.io.IOException;
    
    public class ExceptionMain {
        public static void main(String[] args) {
            ExceptionHanding.try1();
        }
    }
    
    class ExceptionHanding {
        public static void try1() {
            System.out.println("start of try1");
            try {
                try2();
            } catch (IOException e) {
                System.out.println(e + "something went wrong with IO");
            }
            System.out.println("end of try1");
        }
    
    
        public static void try2() throws IOException {
            System.out.println("start of try2");
            try3();
            System.out.println("end of try2");
        }
    
        public static void try3() throws IOException{
            System.out.println("start of try3");
            throw new IOException("IO error in method try3/");
        }
    }
    

    IOExceotion异常在try3方法中显示地出现,但是没有在这个方法中捕捉。因此在try3的方法标题中添加一个throws子句,确保将异常传送回调用try3方法的try2方法。然后,try2方法再将异常传送回try1方法,这个方法将捕捉异常。因此,main方法不再需要throw子句或者catch代码块

  • 相关阅读:
    TP-LINK WR941N路由器研究
    thinkjs初试
    记浏览器帐号登录插件开发遇到的问题
    你被adblock坑过吗?
    web应用,我们需要了解什么?
    算法之合并排序
    算法之插入排序
    算法之初体验
    nodejs学习笔记之网络编程
    炫酷吊炸天的nodeppt
  • 原文地址:https://www.cnblogs.com/miaowulj/p/14408360.html
Copyright © 2020-2023  润新知