java.lang.Throwable
- java.lang.Error:一般不编写针对性的代码进行处理。
- java.lang.Exception:可以进行异常的处理
- 编译时异常(checked)
- IOException
- FileNotFoundException
- ClassNotFoundException
- 运行时异常(unchecked,RuntimeException)
- NullPointerException
- ArrayIndexOutOfBoundsException
- ClassCastException
- NumberFormatException
- InputMismatchException
- ArithmeticException
try
-catch
-finally
try{ //可能出现异常的代码 }catch(异常类型1 变量名1){ //处理异常的方式1 }catch(异常类型2 变量名2){ //处理异常的方式2 }catch(异常类型3 变量名3){ //处理异常的方式3 } .... finally{ //一定会执行的代码 }
- finally是可选的,代码块中的语句一定会被执行
- 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结构
- catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错
- 常用的异常对象处理的方式: ① String getMessage() ② printStackTrace()
- 像数据库连接、输入输出流、网络编程Socket等资源,JVM不能自动的回收的,需要手动的进行资源的释放,就需要声明在finally中
throws
"throws + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!
捕捉并处理知道如何处理的异常,而抛出不知道如何处理的异常。
如何定义:
- 继承于现的异常结构:RuntimeException 、Exception
- 提供全局常量:serialVersionUID
- 提供重载的构造器
public class MyExceptionTest { public static void main(String[] args) { MyExceptionTest test = new MyExceptionTest(); test.method(); } public void method() { try { method1(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } public void method1() throws Exception { throw new MyException("抛出异常!"); } } class MyException extends Exception { static final long serialVersionUID = -33875353129948L; public MyException() { } public MyException(String msg) { super(msg); } }