1. 异常抛出
下面是我们最常用到的抛出异常的方式,
package test.basic.exception;
public class ThrowExceptionTest {
public static void main(String[] args) {
Object t = null;
if(t==null){
throw new NullPointerException();
}
}
}
当然通过源码可以看到,NullPointerException也有一个带参数的构造,且是一个运行时异常
public
class NullPointerException extends RuntimeException {
private static final long serialVersionUID = 5162710183389028792L;
/**
* Constructs a {@code NullPointerException} with no detail message.
*/
public NullPointerException() {
super();
}
/**
* Constructs a {@code NullPointerException} with the specified
* detail message.
*
* @param s the detail message.
*/
public NullPointerException(String s) {
super(s);
}
}
2. 异常捕获
一般异常捕获的代码如下,
try {
Inet4Address.getLocalHost();
Class.forName("abc");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(Exception e){
e.printStackTrace();
}
说明:
- 找到一个成功匹配的catch异常,匹配就会结束
- 不会同时匹配多个异常,
- 一般会保留一个最广泛的Exception留在最后,保证都可以匹配上
- 将具体的、范围小的异常放在前面,范围大的、基类抽象的放在下面
3. 自定义异常
java本身已经定义了许多的异常,当然也可以根据自身业务需要,自定义业务异常。
class MyException extends Exception {
public MyException(){}
public MyException(String msg){
super(msg);
}
public String getMessage(){
return "exception msg:" + super.getMessage();
}
}
可以看到,我们只要继承了已有的Exception异常类,就可以生成自定义的异常类,当然自定义需要的构造参数都可以。
4. 使用finally清理
finally语句,是不管异常是否发生,或是异常是否被捕获,都会去执行最终的finally语句
这里,有两个注意:
1)当遇到break或是continue时,也会执行finally语句
2)finally一般是用来释放某些资源,比如打开的文件,网络连接等