1.java异常结构
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。
Error
:该类异常由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。Exception
:在Exception分支中有一个重要的子类RuntimeException(运行时异常),该类型的异常自动为你所编写的程序定义ArrayIndexOutOfBoundsException(数组下标越界)、NullPointerException(空指针异常)、ArithmeticException(算术异常)、MissingResourceException(丢失资源)、ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;而RuntimeException之外的异常我们统称为非运行时异常,类型上属于Exception类及其子类,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。- 区别:
Error
这一类异常是程序无法处理的。Exception
这一类异常我们可以通过try/catch异常捕获或者抛异常进行处理。
2.异常处理
异常处理有以下三种方法:
- 1.
try/catch/finally
- 2.
throw
- 3.
throws
抛出异常
try/catch/finally
try {
//代码。。。。
}catch (xxxx e1){
//处理异常
}catch (xxxx e2){
//异常处理
}finally {
//....
}
注意多个catch时,前面的放小异常,后面放大异常,否则放在后面的小异常会被前面的大异常覆盖。
finally括号中的代码是一定会执行的(如对于使用IO流时,发生异常在finally中把流关闭)。
throw
throw是语句抛出一个异常,一般是在代码的内部,当程序出现某种逻辑错误时同程序主动抛出某种特定类型的异常。
public static void main(String[] args) {
String user = "";
if(user.length()<=0){
throw new NullPointerException("用户名不能为空");
}
}
运行结果:
Exception in thread "main" java.lang.NullPointerException: 用户名不能为空
at com.exception.MyException.main(MyException.java:14)
throws
throws是将方法中可能产生的异常抛出交给上层调用者去处理。
public static void testThrows() throws NumberFormatException {
String str = "exception";
System.out.println(Integer.parseInt(str));
}
public static void main(String[] args) {
try {
testThrows();
}catch (NumberFormatException e){
e.printStackTrace();
}
}
运行结果:
java.lang.NumberFormatException: For input string: "exception"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at com.exception.MyException.testThrows(MyException.java:12)
at com.exception.MyException.main(MyException.java:18)
3.自定义异常
自定义异常继承以下三个类都可以:
Throwable
Exception
RuntimeException
这里以继承RuntimeException举例:
public class MyException extends RuntimeException{
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
public static void main(String[] args) {
throw new MyException("错误消息");
}
}