lambda表达式 java8新特性之一
-
java中的方法:
-
方法的格式
-
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...){
-
方法体语句;
-
return 返回值;
-
}
-
lambda表达式 不关心修饰符、返回值类型、方法名,
-
也就是说 只保留 参数列表 和方法体
-
为什么???先去了解什么是函数式接口。
-
函数接口:
-
定义:一个接口中只有一个抽象方法,那么这个接口就是函数式接口
-
可以在函数式接口上添加一个@FcuntionalInterface注解,来让编译器
-
对该接口进行编译期检查,如果不是函数式接口就会不通过编译
-
举例:比如我们创建线程的Runnable接口就是一个函数式接口
-
语法:
-
基本语法:
-
(参数类型 参数名1,参数类型 参数名2...)->{方法体 return语句} 前端管这个叫箭头函数其实就是lambda表达式
-
java方法中方法:
-
无参无返回值
-
无参有返回值
-
有参无返回值
-
有参有返回值
-
函数编程接口:
-
无参无返回值
-
无参有返回值
-
有参无返回值
-
有参有返回值
lamda表达式精简语法:
1、参数类型可以省略
2、假如只有一个参数,()括号可以省略
3、如果方法体只有一条语句,{}大括号可以省略
4、如果方法体中唯一的语句是return返回语句,那省略大括号的同时return也要省略
异常:就是java代码中出现的错误
空指针异常 下标越界异常 算术异常 类型转换异常
-
异常有哪些?
-
Throwable(异常的顶级父类)
-
Error(错误) 服务器宕机,数据库崩溃一些硬件方面的客观因素
-
Exception(异常)
-
编译期异常 javac xxx.java 编译.java文件的时候出现的异常
-
简单理解:语法写错了 下面出红线了
-
运行期异常 java xxx.class 执行字节码文件的时候出现的异常
-
简单理解:语法是对的,逻辑是不对
异常处理:
-
java处理异常的方式有两种:
-
- main自己处理,就是交给程序员处理
-
1.try...catch
-
2.throws
-
- jvm处理,直接停止程序,给出错误相关信息
try...catch语法:
try{
可能会出现异常的代码
}catch(可能会出现的异常类型 e){
补救措施,异常出现后,在这里加入处理异常的业务逻辑
}finally{
可写可不写,一般用于释放资源,关流,关连接
}
执行流程:
-
try里面的代码一旦出现了运行时异常
-
就会立即执行catch里面的代码
-
finally里面的代码是一定会执行的,但是finally可以写,也可以不写
如果某段代码不涉及关流释放资源等,就可以不写finally
注意事项:
-
catch可以写多个的,下面的catch类型一定要大于上面catch类型
-
catch小括号里面的异常 可以用 | 符号 隔开
try{
System.out.println(10/0);
}catch(IndexOutOfBoundsException | ArithmeticException e){
System.out.println("数组下标越界了...或者0不能做分母");
}catch (Exception e){
System.out.println("报错了。。。。");
}finally{
System.out.println("finally一定会执行...");
}
Throws(抛出)
概念:
创建方法的时候,把可能出现的异常通过Throws关键字暴露出来,让调用者去处理
如何使用:
在创建方法的时候,后面的小括号写上throws 异常类型
什么时候用try...catch 什么时候用throws???
-
在方法内部,你如果可以处理的,就用try..catch
-
如果你处理不了的,就用throws
-
如果出现异常后,代码还想继续往下执行的话,就用try...catch
-
如果出现异常后,代码直接停止的话,就用throws
public class Demo05Throws{
public static void main(String[] args) throws Exception {
Person1 person1 = new Person1();
person1.setAge(1500);
System.out.println("程序继续向下执行.....");
}
}
class Person1{
private int age;
public void setAge(int age) throws Exception{
if(age>0 && age<150){
this.age = age;
}else{
System.out.println("年龄不合法...");
// 运行时异常...
throw new RuntimeException();
}
}
自定义异常
Java中的异常类,不一定能满足我实际业务开发中的异常需求,比如我想给一个年龄不能为负数异常,就需要用自定义异常
自定义异常的要求:
a)自定义异常类必须继承于异常体系中的类,一般继承于Exception类和RuntimeException类(只有继承于异常体系中的类,那么该类才具备可抛性,也就是继承于异常体系中的类采用使用throw关键字
b)自定义异常类必须提供两个构造方法,一个是无参构造方法,另一个是有参构造方法
public static void main(String[] args) {
Person2 person2 = new Person2();
person2.setAge(-1);
System.out.println("程序继续向下执行...");
}
}
class Person2{
private int age;
public void setAge(int age){
if(age<0){
throw new AgeException("年龄不能为负数");
}else{
this.age = age;
}
}
}
class AgeException extends RuntimeException{
/**
* 子类对象的构造方法里面调用父类的有参构造
*/
public AgeException(){
}
public AgeException(String message){
super(message);
}
}
异常捕获注意:
try...catch中如果有return语句,finally一样会执行,
finally是在return之前执行
jvm在执行try...catch的时候,如果遇到了return,会先看下是否有finally未执行,如果有finally,
就会先执行finally,然后再回头执行return语句
try{
System.out.println(10/0);
}catch(Exception e){
// 表示结束方法
return;
}finally {
// finally里面的代码一定会执行
System.out.println("finally是否执行...");
}