Java把错误和异常都分类了
首先Java把错误分为两大类,都是java.lang.Throwable的子类
- java.lang.Error系统级的异常,一般程序很难调试。
- java.lang.Exception 程序级的异常,通过代码可以处理
java.lang.Exception 它是一切程序级异常的父类
- java中把所有产生的程序级异常都进行了分类,我们程序中出现的任何异常都能在分类中找到。
- Exception大的方向分为了两种
- JVM能指定捕获的的异常java.lang.RuntimeException及其子类,当然也可以直接处理。
- JVM不能捕获的异常必须通过程序自动处理,如果不处理程序编译不通过。
try catch关键字
try{
//业务代码(可能会产生异常)
}catch(异常类 异常对象){
//异常处理
}
try后面可以后有多个catch,多个catch的时候要注意:
子类一定要放在父类的前面,因为父类的引用可以引用子类的对象
java.lang.Exception是一切异常的父类,它就可以处理任何异常(可能信息不太准确)
finally关键字
不管有木有异常最终都要执行的语句(有一些资源需要关闭)
try{
//有可能产生都要异常}catch(异常类 异常对象){
//编写异常的处理语句
}catch(异常类 异常对象){
//编写异常的处理语句
}finally{
//一定会运行的程序代码
}
finally语句块的编写要求
finally作为异常的统一出口,所以在此语句块中的编写尽可能不要出现像throw或return这样的语句,这样可以避免不必要的问题出现。
throw/throws
throw是某种情况下抛出(制造出)一个异常
throws是用来回避异常的
throw和throws的综合应用
//throws
class Math
{
public int div(int i ,int j)throws Exception{
System.out.println("********计算开始*******");
int temp = 0;
try
{
temp=i/j;
}
catch (Exception e)
{
throw e;
}finally{
System.out.println("********计算计算*******");
}
return temp;
}
}
class ThrowDemo02
{
public static void main(String[] args)
{
Math m = new Math();
try
{
System.out.println("除法操作"+m.div(10,0));
}
catch (Exception e)
{
System.out.println("异常处理" +e);
}
}
}
Exception类与RuntimeException类
- Exception在程序中必须使用try…catch来进行处理
- RuntimeException可以不使用try…catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。
需要注意的是:当子类重写父类方法的时候,不能throws比父类更多的异常。
除非throws的异常是RuntimeException 。
原理:Java中,父类可以接受任何子类对象,如果子类比父类有更多的约束,那么父类处理了就出现了问题。所以在Java中子父类进行了继承,子类不能比父类有更多的约束。面向对象的设计中有一个里氏替换原则说明的就是这个问题。
自定义异常类
定义异常类只需要继承Exception类即可
//自定义异常
class MyException extends Exception
{
public MyException(String msg){
super(msg);
}
}
class DefaultException
{
public static void main(String[] args)
{
try
{
throw new MyException("自定义异常");
}
catch (Exception e)
{
System.out.println(e);
}
}
}