lambda表达式&异常

42 阅读5分钟

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处理异常的方式有两种:

    1. main自己处理,就是交给程序员处理
  • 1.try...catch

  • 2.throws

    1. jvm处理,直接停止程序,给出错误相关信息

try...catch语法:

try{

可能会出现异常的代码

}catch(可能会出现的异常类型 e){

补救措施,异常出现后,在这里加入处理异常的业务逻辑

}finally{

可写可不写,一般用于释放资源,关流,关连接

}

执行流程:

  1. try里面的代码一旦出现了运行时异常

  2. 就会立即执行catch里面的代码

  3. finally里面的代码是一定会执行的,但是finally可以写,也可以不写

如果某段代码不涉及关流释放资源等,就可以不写finally

注意事项:

  1. catch可以写多个的,下面的catch类型一定要大于上面catch类型

  2. 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???

  1. 在方法内部,你如果可以处理的,就用try..catch

  2. 如果你处理不了的,就用throws

  3. 如果出现异常后,代码还想继续往下执行的话,就用try...catch

  4. 如果出现异常后,代码直接停止的话,就用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是否执行...");
}