《数据结构和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代码块

原文地址:https://www.cnblogs.com/miaowulj/p/14408360.html