程序运行过程中的发生了不正常的情况
java语言时很完善的语言,提供了异常处理方式,出现异常,将异常信息打印到输出控制台,供程序员参考。
作用:增强程序的健壮性
每一个异常类都可以创建一个对象出来。
(1)Throwable的两个子类:
<1>Error---错误,都是不可处理的,直接退出JVM
<2>Exception---异常,可以处理
所有的异常都是发生在运行阶段,因为只有运行阶段才可以new对象
两个子类:
(2)老杜总结图
编译时异常一般发生的概率比较高----运行之前预处理(受检异常,受控异常)
运行时异常一般发生的概率比较低-----没必要在运行之前预处理(未受检异常,非受控异常)
---必须处理,处理后才能正常执行,不然就程序中止了
(1)throws上抛--交给上一级调用者处理(异常上抛)
(2)try...catch -----异常捕捉,自己处理(真正的处理)
看这个错误是否需要上报,需要选择throws,其他都用catch
【注】
故一般main方法建议使用try...catch处理
让程序编译通过,通过后,再根据运行时提示信息去调程序,而不是异常不处理,JVM运行时直接中止,控制台报错
即:主要目的是让程序顺利运行,控制台打印出异常而不是不报错中止,
虽然有异常,但是通过异常处理方式给出来,只是待进一步进行问题的解决
try{
程序正常要执行的语句
}catch (具体异常类 e){
处理语句
}finally{
有无异常都必执行的语句,一般放资源释放语句
}
catch捕捉到异常后才会执行catch内及后续的代码
(1)main方法中一定用try catch语句
(2)catch可以写多个,也可以不写
每个catch可以对应一个具体类,精确的一个一个处理,有利于程序的调试
catch写多个时,异常类从上到下必须遵循从小到大(异常具体类在上---异常父类在下)
(3)finally相关
(4)return语句
return语句一定最后执行的,无论是return;还是return i
(1)两个重要的方法
e.getMessage()---获取异常的简单描述信息
只是获得简单描述,对调错没有指导性作用
e.printStackTrace()----打印异常追踪的堆栈中信息(开发中用比较多)
e是异常对象
(2)e.printStackTrace()--打印堆栈中错误信息
异常处理时,catch语句中必须加e.printStackTrace()
这样控制台才能在正常运行程序的情况下,还能打印出异常信息,否则,异常抛出或捕捉后,没有异常提示信息,会以为没有异常
(3)查看异常追踪信息,快速调试程序:
在方法声明的位置上,加上throws关键字,抛给上一级调用者(异常上抛)
上一级调用者同样也有这两种处理方式---throws和catch
【注】这种方式有异常情况下,该方法下的后续代码不会执行,通过 [方法名 throws 异常类名] 直接跳到上级调用方法
(1)编写一个类继承Exception或RuntimeException
(2)提供两个构造方法,一个无参数的,一个带有String参数的
有参的构造方法用来传递提示信息----e.getMessage
//1、自定义异常类
public class MyException extends Exception{
//无参构造
public MyException ();
//有参构造
public MyException (String s);
}
//2、使用异常类
public class Test{
puiblic static void main(String[] args){
//创建自定义异常对象
MyException e=new MyException ("密码错误!");
//打印堆栈信息
e.printStackTrace();
//获取并输出异常的描述信息
String msg=e.getMessage();
System.out.println(msg);
}
}
这样控制台不仅会输出自定义异常的堆栈信息,还会输出 描述信息
通过使用自定义异常类,来中止不满足条件的情况,不是用return终止的方式
一般方式:不满足条件,return; 终止方法
调用异常方式: throw new MyException ("密码错误!"),不满足条件,抛异常并终止
io异常
避免空指针异常的两个经验:
(1)判断一个对象是否为null最好放在条件的最前面
(2)判断一个对象是否等于null,最好用【null==对象名】 或 【”某值“.equals(对象)】
因为 对象==null,容易误写成 对象=null,就成赋值----空指针异常
对象.equals(”某值“)----如果对象的值一旦是空----空指针异常
(1)出现条件:
强制类型转换出错----两个对象没有继承关系
(2)避免方法----instanceof运算符