·语法和逻辑错误不是异常
·异常分为:Error,Exception
Error
·java虚拟机无法解决的严重问题
·例如:StackOverflow,out of memory
Exception
·Exception分为:运行时异常、编译时异常(必须处理,不然标红)
·例如:空指针访问、读取不存在的文件、网络连接中断
异常体系图
异常处理机制
try-catch-finally
·异常发生时,系统将异常封装成Exception对象e,传递到catch内
try{
代码
}catch(Exception e){
出现异常后的处理操作
}finally{
无论有无异常都执行的代码
}
·finally中通常写对于资源的释放
·选取中一段代码加上快捷键Ctrl+Alt+T可以快速形成try-catch语句
·try中运行到有异常的语句后直接跳到catch中,而不会执行剩余语句
·finally和catch都可以不写,单留一个try
·catch语句可以不止一个
try{
...
}catch{
return 1;
}finally{
return 2;//最终返回2而不是1
}
int i=0;
try{...
}catch(Exception e){
return i++;//将i++=2这个数存到temp中,返回temp=1
}finally{
System.out.println("i=",++i);//输出2
}
throws(默认)
·异常throws到JVM是最底层的了。这时候JVM的处理为直接输出异常并退出程序
·每个方法默认为throws Exception,但编译异常需要写出throws才能IDEA中没有异常提示
public static void f1()throws Exception{//Exception是父类,也可以写具体的子类或列表
...
}
·子类重写父类方法时,子类方法throws的异常要为父类方法抛出异常的子类/相同类
class Father{
public void f1()throws RuntimeException{
....
}
}
class Son extends Father{
@Override
public void f1()throws NullPointerException/RuntimeException{
....
}
}
自定义异常
·定义没在Throwable子类中的异常
例如定义一个年龄限制范围的自定义异常
public static void main(){
int age=180;
if(age>120){
throw new AgeException("年龄出错!");//throw创建异常对象,可以是自定义异常,也可以Throwable子类
}
}
class AgeException extends RuntimeException{
public AgeEXception(String message){//构造器传入string
super(message);
}
}
·自定义异常一般继承RuntimeException。好处为不是编译异常,因此不会标红。
throws与throw区别
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种机制 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体内 | 异常对象 |