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文档:根据这些类以及接口以及其中的成员创建出来的文档 -> 是程序员的"字典"



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



第三章.枚举
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();
}
}

2.异常出现的过程


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("哈哈哈哈");
}
}

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+回车
或者:先选中被 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做一个统一的异常处理

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方法,应该交给垃圾回收机制通知。
