异常概念理解
程序执行过程中出现的不正常情况,虚拟机会将异常信息打印到控制台上,为了增强程序的健壮性
异常的存在形式
- 异常在java中以类的形式存在,每一个异常类都可以创建异常对象
异常发生的时间
- 都是发生在运行阶段
- 编译时异常是因为必须在编译阶段预先处理,否则会报错,所以叫编译时异常
- 异常是以类的形式存在,发生异常时都会new一个异常对象,只有在运行阶段才可以new对象
异常的分类
- 主要分为:错误,受控异常,非受控异常
- 错误:程序中出现了error,无法恢复,只能重新启动应用程序
- 受控异常:出现了这种异常必须处理,不处理的话程序无法编译通过,又称"编译时异常"
- 非受控异常:出现了这种异常可以不处理,例如一个数字被0除的异常,又称"运行时异常"
处理异常的手段
- 两种方式,分别是使用throws关键字,将异常抛给上级,另一种是使用try...catch语句进行捕捉
- 如果持续使用throws关键字进行上抛,最终会抛给main(),然后是JVM,此时程序会直接结束,所以建议在main方法中的异常使用try...catch进行捕捉
注意
- 出现编译时异常的时候,需要考虑采用哪种处理方式
- 不要在main()方法中使用上抛的处理方式
- 使用try...catch的时候,可以将异常信息打印出来
- throws可以抛出多个异常,用,隔开
- 使用throws时,如果程序发生异常,后续代码无法执行
- 使用try...catch时,如果程序发生异常,try语句快中,异常代码的后续代码无法执行,try...catch处理完之后,后续代码可以正常执行
java
public class ExceptionTest01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
NumberFormatException nfe = new NumberFormatException("数字格式异常对象");
System.out.println(nfe);
// 调用doSome()方法
// 如果没有在编译的时候处理,编译会报错
//doSome();
try {
doSome();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* 该方法使用了throws ClassNotFoundException
* 表示
* 1、该方法在执行的时候可能会抛出ClassNotFoundException异常
* 2、ClassNotFoundException的父类是Exception,属于编译时异常,则在调用的时候需要手动处理
* */
public static void doSome() throws ClassNotFoundException{
System.out.println("HelloWorld");
}
}
异常对象常用的方法
- 获取异常简单的描述信息:String msg = exception.getMessage();
- 打印异常追踪的堆栈信息:exception.printStackTrace();
java
public class ExceptionTest03 {
public static void main(String[] args) {
// TODO Auto-generated method stub
NullPointerException e = new NullPointerException("空指针异常");
// 获取异常的简单信息
String msg = e.getMessage();
System.out.println(msg);
// 打印异常堆栈信息,是采用异步线程的方式打印的
e.printStackTrace();
System.out.println("HelloWorld");
}
}
java.lang.NullPointerException: 空指针异常
空指针异常
at java_SE/com.javase.exception.ExceptionTest03.main(ExceptionTest03.java:9)
HelloWorld
finaly语句
- 必须要和try...catch语句一起联合使用
- finally子句中的代码是最后执行的,并且一定会执行
- 主要用于流的关闭,因为流在使用完之后是一定要关闭的,如果在try语句中关闭,如果出现了异常,异常后面的代码执行不了,有可能没有关闭流
自定义异常
java
public class MyException extends Exception {
public MyException() {
}
public MyException(String s) {
super(s);
}
}
java
public class MyExceptionTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyException e = new MyException("用户名不能为空");
e.printStackTrace();
String msg = e.getMessage();
System.out.println(msg);
}
}