一、lambda表达式
lambda表达式主要是替换了原有匿名内部类的写法,也就是简化了匿名内部类的写法。
(parameters)->expression 或者 (parameters)->{ statements; }
- Lambda表达式语法示例:
- 不需要参数,返回值为 5 :() -> 5
- 接收一个参数(数字类型),返回其2倍的值: x -> 2 * x
- 接受2个参数(数字),并返回他们的差值: (x, y) -> x – y
- 接收2个int型整数,返回他们的和: (int x, int y) -> x + y
- 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void): (String s) -> System.out.print(s)
lambda是方法的实现;
lambda是延迟执行的;
lambda表达式编译后只是定义了一个方法调用点,具体调用那个方法要到运行时才能决定。
lambda表达式对返回的实例类型有严格的要求:
必须是接口
接口中只有一个需要实现的抽象方法,因为如果接口中有超过1个抽象方法需要实现的情况并不适用于lambda表达式
每一个lambda表达式都对应一个接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会匹配到这个抽象方法。因为默认方法不算抽象方法,所以也可以给函数式接口添加默认方法。
lambda表达式中是无法访问到默认方法的。
可以直接访问标记了final的外层局部变量,或者实例的成员变量以及静态变量
二、:: 操作符
JDK8中引入了一个新的操作符(::)
:: 操作符主要用作静态方法、成员方法、构造方法的绑定
三、枚举
所有的枚举都继承自java.lang.Enum类。由于Java不支持多继承机制,所以枚举对象不能再继承其他类。
枚举可以实现接口。
不能有public构造方法,可以有其他修饰符修饰的构造方法,这样保证客户代码没有办法新建一个enum实例。
所有的枚举都是public static final 的
- Enum默认实现了java.lang.Comparable接口。
- Enum覆载了了toString方法
- Enum提供了一个valueOf方法,这个方法和toString方法是相对应的
- Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值
- Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定
四、异常
Throwable:包含有异常(Exception)和错误(Error)。
- Throwable类有两个子类:Exception和Error;所有异常都是Exception类的直接或间接子类;所有错误都是Error的直接或间接子类;
异常:指的是程序运行时发生的不正常事件;异常能够被程序处理,保证程序继续运行下去;例如,除数为0,文件没有找到,输入的数字格式不对......
错误:错误程序没法处理,例如内存泄漏,发生错误后,一般虚拟机会选择终止程序运行,程序员需要修改代码才能解决相关错误:
Exception分为:非运行时异常(检查异常)和运行时异常(非检查异常)
运行时异常:也称为非检测异常(unchecked Exception), 这些异常在编译期不检测,程序中可以选择处理,也可以不处理。如果不处理运行时会中断,但是编译没问题;
非运行时异常:也称为检测异常(checked Exception), 是必须进行处理的异常,如果不处理,将发生编译期错误;
RuntimeException的子类都是运行时异常。
五、异常说明
1.NullPointerException 空指针异常
当对一个空对象,即没有初始化,依然为null的对象调用属性或者方法。
public static void main(String[] args){
String str = null; // 值为null
System.out.println(str.length()); // 这里调用了一个空的字符串 那么就会报空指针异常 // 注意 这里String内的length是方法 而在数组中的length是属性
}
2.AirthmeticException 数学异常
整除0时会发生数学异常
public static void main(String[] args){
// 浮点数除以0时不会发生数学异常
System.out.print(10.0/0);
// 整数除以0时会发生数学异常
System.out.print(10/0);
}
3.IndexOutOfBoundsException 数组越界异常
4.NumberFormatException 数组格式异常
5.ClassCastException 类型转换异常
当发生非运行时异常时,编译器会自动报错,必须修改才能执行程序。
当发生运行时异常时,必须是执行后才会报错,并且执行到异常时会中断程序,不会再向下执行。
六、try-catch-finally
把所有可能抛出异常的,或者肯定抛出异常的代码都写入try代码块中。
catch语句紧跟其后,用来捕获异常并进行处理:
1 // 语法格式:
2 try{
3 //可能出现异常或者肯定出现异常的代码
4 }catch(可能出现的异常类型 e){
e.printStackTrace; // 可以查看异常发生的轨迹
5 // 捕获到该异常该怎么处理
6 }finally{
7 // 除非try中使用了System.exit(0)语句 否则该语句块里的代码都会执行 就算try块中return,那也会执行finally块内的代码
8 }
说明:
当try块中代码抛出了异常后,异常处理机制就将这个对象的类型与try后的catch语句中的异常类型进行匹配,如果类型相同,那么就会执行该catch块中的代码,否则,异常没有被捕获,程序将中断。
使用try-catch-finally会发生三种情况:
1.发生异常被捕获处理
2.发生异常没有捕获处理
3.没有发生异常
一个try-catch-finally语句中:必须有一个try,catch可以有一个或多个,finally最多只能有一个。
还有另一种组合:try-finally,没有catch
七、异常抛出
抛出异常的意思是:创建了一个异常对象,然后使用关键字throw交给异常处理机制去处理。
// throw使用格式:
throw new Exception();
// 或者
cartch(Exception e){
throw e;
}
throw用在方法声明处,声明该方法可能发生的异常类型。
public void eat() throws Exception{
System.out.print(10/0);
}
一个方法如果使用了throws,那么调用该方法时,编译器会提醒必须处理这些异常,否则会编译错误。
throws后可以声明多种异常类型,用逗号隔开就可以。
抽象方法也可以使用throws来抛出异常。
八、自定义异常
自定义异常类必须继承Exception类,按照需要来重写所需的构造方法。
class MyException extends Exception{ // 继承Exception类 并且重写打印错误信息方法
public MyException(String message){
super(message);
}
}
九、断言
JDK1.4之后,增加了断言机制。
断言用来调试,不在生产环境中使用。 语法格式:
assert <布尔表达式>:<错误信息>
// 当布尔表达式为true时,忽略assert,继续向下执行代码
// 当布尔表达式为false时,程序中断,打印错误信息
注意:在使用时需要进行配置。
-enableassertions
-ea
Window->referecnes->搜索jre->