Java基础知识(9)
(包括:方法引用,异常)
目录
Java基础知识(9)
一. 方法引用
1. 方法引用基础
2. 方法引用的分类
(1)引用静态方法
(2)引用成员方法
(3)引用构造方法
(4)其他调用方式
3. 引用静态方法
4. 引用成员方法
(1)格式:对象::成员方法
5. 引用构造方法
6. 方法引用(类名引用成员方法)
(1)格式
(2)方法引用的规则:(这个特有的)
(3)抽象方法形参的详解:
7. 引用数组的构造方法
二.异常
1.异常基础
(1)异常就是代表程序出现的问题
(2)异常结构
(3)小结
(4)运行时异常和编译时异常的区别
2. 异常的作用
3. 异常的处理方式
4.JVM默认的处理方式
5.自己处理
(1)格式:
(2)目的:当代码出现异常时可以让程序继续往下执行。
(3)例如:
(4)灵魂四问
(5)Throwable 的成员方法
6. 抛出异常(抛出处理)
(1)throws
(2)throw
7. 自定义异常
一. 方法引用
1. 方法引用基础
(1)把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体
(2)引用处必须是函数式接口
(3)被引用的方法必须已经存在(以是Java已经写好的,也可以是一些第三方的工具类,自己写的也可以)
(4)被引用方法的形参和返回值需要跟抽象方法保持一致
(5)被引用方法的功能要满足当前需求
(6)例子
Arrays.sort(arr,new comparator<Integer>){
@Override
public int compare(Integer o1,Integer o2){
return o2-01;
}
});
public int subtraction(int n1,int n2){
return n2 -n1;
}
此处sort可以引用subtraction方法
Arrays.sort(arr,FunctionDemo1::subtraction);
//‘::’表示引用FunctionDemo1类里面的subtraction方法,是方法引用符
//把这个方法当做抽象方法的方法体
2. 方法引用的分类
(1)引用静态方法
(2)引用成员方法
1)引用其他类的成员方法
2)引用本类的成员方法
3)引用父类的成员方法
(3)引用构造方法
(4)其他调用方式
1)使用类名引用成员方法
2)引用数组的构造方法
3. 引用静态方法
(1)格式:类名::静态方法
(2)范例:Integer::parseInt
4. 引用成员方法
(1)格式:对象::成员方法
1)其他类:其他类对象::方法名
2)本类:this::方法名
3)父类:super::方法名
list.stream().filter(new FunctionDemo3()::stringJudge)
.forEach(s->System.out.println(s));
静态方法中是没有this,super的,也得这样写。
5. 引用构造方法
(1)格式:类名::new
范例:Student::new
list.stream().map(Student::new).collect(Collectors.tolist());
public student(string str){
String[]arr =str.split(regex",");
this.name = arr[0];
this.age = Integer.parseInt(arr[1]);
}(构造方法不需要写返回值)
6. 方法引用(类名引用成员方法)
(1)格式
类名::成员方法
(2)方法引用的规则:(这个特有的)
1)需要有函数式接口
2)被引用的方法必须已经存在
3)被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形參保持一致,返回值需要保持一致。
4)被引用方法的功能需要满足当前的需求
(3)抽象方法形参的详解:
1)第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法
在stream流当中,第一个参数一般都表示流里面的每一个数据。
假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用string这个类中的方法
2)第二个参数到最后一个参数:跟被引用方法的形參保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法
list.stream().map(string::toUpperCase).forEach(s->System.out.printIn(s));
3) 局限性:
不能引用所有类中的成员方法,是跟抽象方法的第一个参数有关,这个参数是什么类型的,那么就只能引用这个类中的方法。
7. 引用数组的构造方法
(1)格式:数据类型[]::new
范例:int[]::new
(2) 细节:
数组的类型,需要跟流中数据的类型保持一致。
Integer[]arr2 =list.stream().toArray(Integer[]::new);
二.异常
1.异常基础
(1)异常就是代表程序出现的问题
(2)异常结构
Java.lang.Throwable | ||
Error | Exception | |
RuntimeException | 其他异常 | |
NullPointerException ArithmeticException ArrayIndexOutOfBoundsException 等等 |
1)Error:
代表的系统级别错误(属于严重问题)
系统一旦出现问题,sun公司会把这些错误封装成E7ror对象
Error是给sun公司自己用的,不是给我们程序员用的,因此我们开发人员不用管它。
2)Exception:
叫做异常,代表程序可能出现的问题。
我们通常会用Exception以及他的子类来封装程序出现的问题。
①运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒。
运行时出现的异常(如:数组索引越界异常)
②编译时异常:编译阶段就会出现异常提醒的。(如:日期解析异常)
(3)小结
1)异常是什么?
程序中可能出现的问题
2)异常体系的最上层父类是谁?异常分为几类?
父类:Exception。
异常分为两类:编译时异常、运行时异常
3)编译时异常和运行时异常的区别?
编译时异常:没有继承RuntimeExcpetion的异常,直接继承于Excpetion。
编译阶段就会错误提示
运行时异常:RuntimeException本身和子类,
编译阶段没有错误提示,运行时出现的
(4)运行时异常和编译时异常的区别
1)编译时异常:除了RuntimeExcpetion和他的子类,其他都是编译时异常
编译阶段需要进行处理,作用在于提醒程序员
2)运行时异常:RuntimeException本身和所有子类,都是运行时异常,
编译阶段不报错,是程序运行时出现的,一般是由于参数传递错误带来的问题
2. 异常的作用
(1)作用一:异常是用来查询bug的关键参考信息
(2)作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况(主动抛出异常)
3. 异常的处理方式
(1)JVM默认的处理方式
(2)自己处理
(3)抛出异常
4.JVM默认的处理方式
(1)把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
(2)程序停止执行,下面的代码不会再执行了
5.自己处理
(1)格式:
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}finally {
}
特点:finally里面的代码一定被执行,除非虚拟机停止
(2)目的:当代码出现异常时可以让程序继续往下执行。
(3)例如:
int[]arr={1,2,3,4,5,6};
try{
//可能出现异常的代码;
System.out.printin(arr[10]);//此处出现了异常,程序就会在这里创建一个ArrayIndexoutofBoundsException对象
//new ArrayIndexOutofBoundsException();
//拿着这个对象到catch的小括号中对比,看括号中的变量是否可以接收这个对象
//如果能被接收,就表示该异常就被捕获(抓住),执行 catch里面对应的代码
//当catch里面所有的代码执行完毕,继续执行try...catch体系下面的其他代码
}catch(ArrayIndexOutOfBoundsException e)
//如果出现了ArrayIndex0utOfBoundsException异常,我该如何处理
System.out.println("紫引越界了”);
}
System.out.println("看看我执行了吗?");
(4)灵魂四问
①灵魂一问:如果try中没有遇到问题,怎么执行?
会把try里面所有的代码全部执行完毕,
不会执行catch里面的代码
②灵魂二问:如果try中可能会遇到多个问题,怎么执行?
会写多个catch与之对应
父类异常需要写在下面
了解性:在JDK7之后,我们可以在catch中同时捕获多个异常,中间用|进行隔开,表示如果出现了A异常或者B异常的话,采取同一种处理方案
③灵魂三问:如果try中遇到的问题没有被捕获,怎么执行?
相当于try..catch白写了,当前异常会交给虚拟机处理
④灵魂四问:如果try中遇到了问题,那么try下面的其他代码还会执行吗?
不会执行了。try中遇到问题,直接跳转到对应的catch
如果没有对应的catch与之匹配,则交给虚拟机处理
(5)Throwable 的成员方法
1)public string getMessage() 返回此 throwable 的详细消息字符串
2)public string tostring() 返回此可抛出的简短描述
3)public void printStackTrace() 把异常的错误信息输出在控制台
(细节:仅仅是打印信息,不会停止程序运行。最常用)
6. 抛出异常(抛出处理)
(1)throws
1)注意:
写在方法定义处,表示声明一个异常
告诉调用者,使用本方法可能会有哪些异常
2)格式:public void 方法()throws 异常类名1,异常类名2...{
}
编译时异常:必须要写
运行时异常:可以不写。
(2)throw
1)注意:
写在方法内,结束方法
手动抛出异常对象,交给调用者
方法中下面的代码不再执行了
2)格式:public void 方法(){
throw new NullPointerException();
}
3) 抛出是为了告诉调用者出错了
捕获是为了不让程序停止
7. 自定义异常
(1)定义异常类
(2)写继承关系
(3)空参构造
(4)带参构造
(5)意义:就是为了让控制台的报错信息更加的见名之意
(6)投巧:
//NameFormat:当前异常的名字,表示姓名格式化问题
//Exception:表示当前类是一个异常类
//运行时:RuntimeException 核心 表示由于参数错误而导致的问题
//编译时:Exception 核心 提醒程序员检查本地信息