API&SPI
API(Application Programming Interface)
大多数情况下,都是
实现方
来制定接口并完成对接口的不同实现,调用方
仅仅依赖却无权选择不同实现,例如:java中的各种可直接使用的工具包
SPI(Service Provider Interface)
而如果是
调用方
来制定接口,实现方
来针对接口来实现不同的实现。调用方
来选择自己需要的实现方
。例如:JDBC
区别
java中区分API与SPI,通俗的讲:API和SPI都是相对的概念,差别只在语义上,API是世界给开发人员用的,SPI是给框架扩展人员使用的
异常
程序在运行过程中发生由于外部问题或程序逻辑错误导致程序不能正常运行的一种事件,Java中,异常本身就是一个对象。所以在程序发生错误不能运行时,开发人员应对该错误进行相应的处理(异常处理)
return与finally的执行顺序
@Test
public void test01(){
System.out.println(getInt());
}
public int getInt(){
int a = 10;
try{
System.out.println("try");
return a+90;
}finally {
System.out.println("开始执行finally");
a = a + 10;
}
}
//out:
//try
//开始执行finally
//100
package com.lm.demo;
public class UserInfo {
private String name;
private Integer age;
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
public class TestDemo {
@Test
public void test01(){
System.out.println(getUserInfo());
}
public UserInfo getUserInfo(){
UserInfo userInfo = new UserInfo();
try{
userInfo.setName("战三");
userInfo.setAge(21);
System.out.println("try->"+userInfo);
return userInfo;
}finally {
System.out.println("finally");
userInfo.setName("王五");
}
}
}
/**
* out:
* try->UserInfo{name='战三', age=21}
* finally
* UserInfo{name='王五', age=21}
*/
**总结:**在try语句中间,在执行return语句后并不会直接返回,而是去执行finally语句,等待finally执行完后再返回,由于java中只用值传递,finally中操作基本数据类型时操作的是一个副本变量,不会影响原来的返回值,若是一个对象,由于该对象的副本变量名与原变量名的引用指向堆中的同一个对象,所有也会改变变量值
try-with-resources
异常处理远侧和技巧
- 避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常
- 细化异常类型,不要不管什么类型的异常都写成Exception
- catch块尽量保持一个块捕获一类异常,不要忽略捕获异常,捕获后要么处理,要么转移,要么重新抛出新类型的异常
- 不要把自己能处理的异常抛给别人
- 不要用try…catch参与控制程序流程,异常控制的根本目的是处理程序的非正常运行