Skip to content

day12.异常_Object

java
课前回顾:
 1.代码块:
   a.构造代码快 -> 优先于构造方法执行,构造方法执行一次,构造代码块就跟着执行一次
     {
       代码
     }

   b.静态代码块 -> 优先于构造代码块以及构造方法执行的,只执行一次
     static{

     }
     如果有一些数据需要先初始化,而且只需要初始化一次,就可以放到静态代码块中
 2.匿名内部类:
   a.创建方式1:以匿名对象去创建匿名内部类的对象
     new 接口(){
       重写的方法
     }.重写的方法名();

   b.创建方式2:以有名对象去创建匿名内部类的对象
     接口 对象名 = new 接口(){
        重写的方法
     }
     对象名.重写的方法名();

 3.lombok:简化javabean的
   a.导jar包
   b.使用注解:
     @Data

 4.Junit:单元测试框架
   a.导jar包
   b.使用注解:
     @Test : 执行被测试的方法
     @Before:在@Test之前执行,有多少个@Test方法执行,@Before对应的方法就执行多少次
     @After: 在@Test之后执行,有多少个@Test方法执行,@After对应的方法就执行多少次

今日重点:
  1.会使用debug代码调试工具
  2.会定义枚举类,以及枚举值
  3.要分清什么是编译时期异常,什么是运行时期异常
  4.会使用throws和try...catch处理异常
  5.知道Object类中toString方法以及equals方法的作用
  6.知道重写完Object类中的toString和equals方法的作用

第一章.Java 其他操作_API 文档

1.API 文档

java
1.什么叫做API(Application Programming Interface):就是类以及接口以及其中的成员
2.API文档:根据这些类以及接口以及其中的成员创建出来的文档 -> 是程序员的"字典"
174312549715517431256933731743125877220

第二章.debug 调试

java
1.概述:debug是一种代码的调试工具
2.作用:
  a.找错
  b.清楚地看到代码中每一个变量值的变化
3.使用:
  a.在要开始debug的那一行左边,点击一下,出现"红色小圆点"-> 再点一下"红色小圆点",就会消失
  b.右键 -> debug运行
174312674653017431287754031743129620363

第三章.枚举

1.枚举介绍

java
1.概述:引用数据类型 (类 数组 接口 枚举 注解 Record)
2.定义:
  public enum 枚举类类名{

  }
3.枚举类中的成员(枚举值)定义:
  a.枚举类中的枚举值都是默认static final的,不要写出来 -> 直接写名字(大写)
  b.枚举值之间用,隔开,如果下面没有其他枚举值了,最后用;结束
4.注意:
  a.枚举类中的每一个枚举值都是当前类的一个对象
  b.问题:既然枚举值都是当前枚举类的对象,那么枚举值的类型是什么类型?
         当前类的类型
5.枚举使用场景:
  一般都是作为一个对象的状态来使用
6.枚举类中的构造:
  a.枚举类中的构造必须是privat的,不写也有
java
public enum State {
   //WEIFUKUAN,//State WEIFUKUAN = new State();
   //YIFUKUAN,//State YIFUKUAN = new State();
   //WEIFAHUO,//State WEIFAHUO = new State();
   //YIFAHUO;//State YIFAHUO = new State();

   WEIFUKUAN("未付款"),//State WEIFUKUAN = new State("未付款");
   YIFUKUAN("已付款"),//State YIFUKUAN = new State("已付款");
   WEIFAHUO("未发货"),//State WEIFAHUO = new State("未发货");
   YIFAHUO("已发货");//State YIFAHUO = new State("已发货");
   String name;
   State(){
   }
   State(String name){
      this.name = name;
   }

   public String getName() {
      return name;
   }
}
java
public class Test01 {
    public static void main(String[] args) {
        State weifukuan = State.WEIFUKUAN;
        System.out.println("weifukuan = " + weifukuan);

        State weifahuo = State.WEIFAHUO;
        System.out.println(weifahuo.getName());
    }
}

2.枚举的方法_Enum

方法名说明
String toString()返回枚举值的名字,返回的是字符串
values()返回所有的枚举值
valueOf(String str)将一个字符串转成枚举类型
java
public enum State {
   //WEIFUKUAN,//State WEIFUKUAN = new State();
   //YIFUKUAN,//State YIFUKUAN = new State();
   //WEIFAHUO,//State WEIFAHUO = new State();
   //YIFAHUO;//State YIFAHUO = new State();

   WEIFUKUAN("未付款"),//State WEIFUKUAN = new State("未付款");
   YIFUKUAN("已付款"),//State YIFUKUAN = new State("已付款");
   WEIFAHUO("未发货"),//State WEIFAHUO = new State("未发货");
   YIFAHUO("已发货");//State YIFAHUO = new State("已发货");
   String name;
   State(){
   }
   State(String name){
      this.name = name;
   }

   public String getName() {
      return name;
   }
}
java
public class Test01 {
    public static void main(String[] args) {
        State weifukuan = State.WEIFUKUAN;
        System.out.println("weifukuan = " + weifukuan);

        State weifahuo = State.WEIFAHUO;
        System.out.println(weifahuo.getName());

        System.out.println("=============================");
        State yifahuo = State.YIFAHUO;
        System.out.println(yifahuo);
        System.out.println(yifahuo.toString());
        System.out.println("=============================");
        State[] values = State.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i].getName());
        }
        System.out.println("============================");
        State yifahuo1 = State.valueOf("YIFAHUO");
        System.out.println("yifahuo1 = " + yifahuo1);
    }
}

第四章.异常

1.异常介绍

java
1.概述:指的是代码出现了不正常的现象,在java中异常其实是一个一个的类,一个一个的对象
2.之前见过的异常:
  ArrayIndexOutOfBoundsException -> 数组索引越界异常
  NullPointerException -> 空指针异常
  ClassCastException -> 类型转换异常
3.异常的分类:
  a.父类: Throwable
  b.Throwable有两个子类:
    Error(错误) : 相当于人得了绝症,重新写-> 不能用代码处理
    Exception(异常) : 相当于人得了感冒,可以治-> 能用代码处理
  c.Exception有两种异常:
    编译时期异常:Exception以及其子类(除了RuntimeException之外)
               语法没错,但是由于调用了某个方法,方法底层抛出了一个编译时期异常,导致调用的时候一编译就报红

    运行时期异常:RuntimeException以及子类:
               语法没错,编译的时候写没错,但是一运行就报错
java
public class Demo01Exception {
    public static void main(String[] args){
        //method();StackOverflowError

        //编译时期异常
        Date date = new Date();
        System.out.println("date = " + date);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //Date date1 = sdf.parse("2019-09-09 12:12:12");
        //System.out.println("date1 = " + date1);

        //运行时期异常
        int[] arr = new int[3];
        arr = null;
        System.out.println(arr.length);
    }
    public static void method(){
        method();
    }
}
1743142271491

2.异常出现的过程

17431427813101743142845859

3.创建异常对象(了解)

此处创建异常对象,是了解内容,学这破玩意儿是为了故意造异常,最终为了学如何处理

java
1.格式:
  throw new 异常对象()
java
public class Demo03Exception {
    public static void main(String[] args) {
        String s = "1.txt1";
        add(s);
        System.out.println("嘻嘻嘻嘻");
    }

    public static void add(String s){
        /*
           boolean endsWith(String s)
           判断字符串是否以指定的串儿结尾
         */
        if (!s.endsWith(".txt")){
            //创建异常对象
            throw new NullPointerException("对象身体被掏空");
        }
        System.out.println("哈哈哈哈");
    }
}
1743143406329

4.异常处理方式(重点)

1 异常处理方式一_throws

java
1.格式:在方法参数后面方法体前面
  throws 异常
java
public class Demo04Exception {
    public static void main(String[] args)throws FileNotFoundException{
        String s = "1.txt1";
        add(s);
        System.out.println("删除功能");
        System.out.println("修改功能");
        System.out.println("查询功能");
    }

    public static void add(String s)throws FileNotFoundException{
        if (!s.endsWith(".txt")){
            //创建异常对象
            throw new FileNotFoundException("文件找不到了");
        }
        System.out.println("哈哈哈哈");
    }
}

2 异常处理方式一_throws 多个异常

java
1.格式:
  throws 异常1,异常2...

2.注意:
  throws的多个异常之间如果有子父类继承关系,我们可以直接throws父类
java
public class Demo05Exception {
    public static void main(String[] args)throws /*FileNotFoundException,*/IOException{
        String s = "1.txt1";
        add(s);
        System.out.println("删除功能");
        System.out.println("修改功能");
        System.out.println("查询功能");
    }

    public static void add(String s)throws /*FileNotFoundException, */IOException{
        if (s==null){
            throw new IOException("IO异常");
        }

        if (!s.endsWith(".txt")){
            //创建异常对象
            throw new FileNotFoundException("文件找不到了");
        }

        System.out.println("哈哈哈哈");
    }
}
java
以后开发千万不要无脑往上throws,因为无脑往上throws,最终还交给jvm处理,jvm会终止程序的,这样就会因为某一个功能出现问题,导致后续所有的功能都执行不了了

3.异常处理方式二_try...catch

java
1.格式:
  try{
      可能出现异常的代码
  }catch(异常 对象名){
      处理异常的方案 -> 将异常信息打印到日志文件中
  }
2.过程:
  如果try中的代码出现了异常,直接走catch进行捕获-> 捕获到了才是处理了,捕获不到相当于没处理
java
public class Demo06Exception {
    public static void main(String[] args) {
        String s = "1.txt1";
        try {
            //String str = null;
            //System.out.println(str.length());//空指针异常

            add(s);
        }catch (FileNotFoundException ex){
            //将详细的异常信息打印到控制台上
            ex.printStackTrace();
        }
        System.out.println("删除功能");
        System.out.println("修改功能");
        System.out.println("查询功能");
    }

    public static void add(String s) throws FileNotFoundException {
        if (!s.endsWith(".txt")) {
            //创建异常对象
            throw new FileNotFoundException("文件找不到了");
        }
        System.out.println("哈哈哈哈");
    }
}
java
如果捕获到了,异常输出来,不会影响后续功能的执行

4.异常处理方式二_多个 catch

java
1.格式:
  try{
      可能出现异常的代码
  }catch(异常 对象名){
      处理异常的方案 -> 将异常信息打印到日志文件中
  }catch(异常 对象名){
      处理异常的方案 -> 将异常信息打印到日志文件中
  }catch(异常 对象名){
      处理异常的方案 -> 将异常信息打印到日志文件中
  }catch(异常 对象名){
      处理异常的方案 -> 将异常信息打印到日志文件中
  }...

2.注意:
  如果catch的多个异常之间有子父类继承关系,我们可以直接catch父类异常
java
public class Demo07Exception {
    public static void main(String[] args) {
        String s = "1.txt1";
/*        try {
            add(s);
        }catch (FileNotFoundException ex){
            ex.printStackTrace();
        }catch (IOException ex){
            ex.printStackTrace();
        }*/

        try {
            add(s);
        }catch (IOException ex){
            ex.printStackTrace();
        }
        System.out.println("删除功能");
        System.out.println("修改功能");
        System.out.println("查询功能");
    }

    public static void add(String s) throws FileNotFoundException, IOException {
        if (s == null) {
            throw new IOException("IO异常");
        }

        if (!s.endsWith(".txt")) {
            //创建异常对象
            throw new FileNotFoundException("文件找不到了");
        }


        System.out.println("哈哈哈哈");
    }
}

特点:

如果成功 catch 到了异常,不会影响后续的代码执行

1.运行时期异常一般不用处理,因为一旦出现运行时期异常,肯定是代码写的有问题,我们只需要修改代码即可

2.编译时期异常需要处理,如果不处理代码中会有爆红,那么代码不管是否触发异常我们都运行不了

3.怎么处理: alt+回车

1743148074583

​ 或者:先选中被 try 的代码 -> 按 ctrl+alt+t

5.finally 关键字

java
1.概述:代表的是不管异常是否能捕获到,一定会执行的代码
2.使用:
  都是和try一起使用
3.格式:
  try{
     可能有异常的代码
  }catch(异常 对象名){
     处理异常的代码
  }finally{
     不管是否能捕获到异常一定会执行的代码
  }
java
public class Demo08Exception {
    public static void main(String[] args){
        String s = "1.txt1";
        try {
            String str = null;
            System.out.println(str.length());//空指针
            add(s);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            System.out.println("删除功能");
            System.out.println("修改功能");
            System.out.println("查询功能");
        }

    }

    public static void add(String s)throws FileNotFoundException{
        if (!s.endsWith(".txt")){
            //创建异常对象
            throw new FileNotFoundException("文件找不到了");
        }
        System.out.println("哈哈哈哈");
    }
}
java
public class Demo09Exception {
    public static void main(String[] args) {
        int result = method();
        System.out.println(result);
    }

    public static int method() {
        try {
            String s = null;
            System.out.println(s.length());//空指针异常
            return 2;
        } catch (Exception e) {
            return 1;
        } finally {
            System.out.println("我一定要执行");
            //return 3;
        }
    }
}

finally 的使用场景:用于回收资源

1.对象都在堆中,当对象不使用了,那么 GC 负责回收堆内存中的对象,但是有一些对象,GC 是回收不了的

​ 比如:IO 流对象,Socket 对象,Connection 数据库连接对象等,GC 是回收不了的

​ 此时就需要我们手动回收,手动回收的代码就放到 finally 中

6.抛异常时注意的事项(扩展)

java
1.父类方法抛异常了,子类重写此方法之后要不要抛?
  可抛可不抛
2.父类方法没有抛异常,子类重写此方法之后要不要抛?
  不能抛

7.try_catch 和 throws 的使用时机

java
1.如果处理异常之后,还想让后续的代码正常执行,我们使用try...catch
2.如果方法之间是递进关系(调用),我们可以先throws,但是到了最后需要用try...catch做一个统一的异常处理
1743151119603

8.打印异常信息的三个方法

java
1.Throwable中的方法
  a.String toString():打印异常类型以及异常信息
  b.String getMessage():打印异常信息
  c.void printStackTrace() :打印的异常信息是最全的
java
public class Demo11Exception {
    public static void main(String[] args){
        String s = "1.txt1";
        try {
            add(s);
        } catch (FileNotFoundException e) {
            //System.out.println(e.toString());
            //System.out.println(e.getMessage());
            e.printStackTrace();
        }
        System.out.println("删除功能");
        System.out.println("修改功能");
        System.out.println("查询功能");
    }

    public static void add(String s)throws FileNotFoundException{
        if (!s.endsWith(".txt")){
            //创建异常对象
            throw new FileNotFoundException("文件找不到了");
        }
        System.out.println("哈哈哈哈");
    }
}

第五章.Object 类

java
1.概述:Object是所有类的根类,所有的类都会直接或者间接继承Object类
2.比如:
  public class Zi extends Fu{}  -> Zi类的亲爹是Fu类
  public class Fu{} -> Fu类的亲爹就是Object

1.native 方法

java
    private static native void registerNatives();->将当前类中的native方法注册进来
    static {
        registerNatives();//注册本地方法
    }
    方法作用:当该类被加载的时候,调用该方法完成对该类中本地方法的注册

    在Object类中,除了有registerNatives这个本地方法之外,还有hashCode()、clone()等本地方法,而在Class类中有forName0()这样的本地方法等等。也就是说,凡是包含registerNatives()本地方法的类,同时也包含了其他本地方法。所以,显然,当包含registerNatives()方法的类被加载的时候,注册的方法就是该类所包含的除了registerNatives()方法以外的所有本地方法

     registerNatives()注册当前类的本地方法

1.native:关键字->代表的本地方法
2.本地方法是有方法体的:c语言编写,本地方法的方法体源码没有对我们开源,所以我们看不到方法体,简单理解为本地方法就是对java语言的扩展,比如:后面io流部分,很多功能java本身没有,比如读写,那么就需要调用本地方法进进行读写
3.位置:在本地方法栈运行
4.意义:跟系统打交道
java
 1.本地方法:对java不能实现的功能进行扩充
 2.本地方法是由C语言编写,源码没有开源
 3.本地方法运行在本地方法栈中

2.GC 垃圾回收简介

运行垃圾回收器,JVM 将从堆内存中清理对象,清理对象的同时会调用对象的 finalize()方法,JVM 的垃圾回收器是通过另一个线程开启的,因此程序中的效果并不明显。

java
1.方法:System类中的方法:public static void gc() -> 运行垃圾回收器
2.作用:主要用于回收堆内存中的数据
3.堆内存中的数据什么时候被清理:如果我们的对象没有用了,GC底层会有很多精妙的算法,会做判断,做回收
  比如: Person p = new Person()
       p = null

       GC ROOTS->可达性算法 ->从根节点出发,是否能到达对应的对象,如果到不了,证明此对象为垃圾,直接清理

4.要了解到的:
  构造方法:new对象的
  析构函数:销毁对象,C语言中才有这个析构函数的概念

  Object中的finalize():相当于C语言中的析构函数,用于清理对象,在回收之前,会自动被调用;而且不是垃圾回收器直接调用的,而是垃圾回收器通知当前对象,自动调用此方法进行对象回收
java
public class Person {
    @Override
    protected void finalize() throws Throwable {
        System.out.println(this+".........被清理了");
    }
}
java
public class Test01 {
    public static void main(String[] args) {
        Person person = new Person();

        System.out.println(person);//地址值

        person = null;

        System.gc();//运行垃圾回收器
    }
}
java
垃圾回收关键点:
1.垃圾回收机制只回收JVM堆内存里的对象空间。
2.对其他物理连接,比如数据库连接(Connection)、输入流输出流(IO)、Socket连接(网络编程)无能为力
3.现在的JVM有多种垃圾回收实现算法,表现各异。
4.垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行
5.可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。-自动
6.程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有
  一些效果,但是系统是否进行垃圾回收依然不确定。
7.垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果重写该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)。
8.永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制通知。
1736932604325