Java异常

异常:程序出现了没有足够信息能继续执行,或者不能按照正常逻辑执行
Java 异常机制,使得我们能在某个地方集中处理要解决的问题。

异常种类:检查时异常,运行时异常
检查时异常,我们必须catch或者抛出,运行时异常不用显示捕捉。
常见运行时异常有:ClassCastException, DateTimeParseException, IllegalArgumentException, ArrayIndexOutOfBoundsException, NullPointerException等。
异常的基类是Throwable, 这个类有2个子类,一个是Error, 另一个是Exception
在实际中我们需要自定义异常类,可以继承Exception或者Throwable。
一个自定义异常的例子:

class CannotOpenException extends Exception{

    private static final long serialVersionUID = 4893739257004490618L;

}

public class TextException {
    public void throwException() throws CannotOpenException{
        System.out.println("do something");
        throw new CannotOpenException();
    }
    
    public static void main(String[] args) {
        try {
            new TextException().throwException();
        } catch (CannotOpenException e) {
            e.printStackTrace();
        }finally {
            System.out.println("Do some clean up.");
        }
    }

}

执行结果:

do something
Do some clean up.
CannotOpenException
    at TextException.throwException(TextException.java:11)
    at TextException.main(TextException.java:16)

有时候使用不当,异常会丢失,常见的问题是在finally执行了return

class CannotOpenException extends Exception{

    private static final long serialVersionUID = 4893739257004490618L;

}

public class TextException {
    public void throwException() throws CannotOpenException{
        try{
        System.out.println("do something");
        throw new CannotOpenException();
        }finally {
            return;
        }
    }
    
    public static void main(String[] args) {
        try {
            new TextException().throwException();
        } catch (CannotOpenException e) {
            e.printStackTrace();
        }finally {
            System.out.println("Do some clean up.");
        }
    }

}

执行结果:

do something
Do some clean up.

异常的继承

  • 子类可以不用声明任何异常如果不调用基类的方法。如果声明只能是基类的类型。
  • 构造函数可以声明任何异常,但必须包含基类的异常。

class CannotOpenException extends Exception {

}

class CannotReadException extends Exception {

}

class CannotWriteException extends Exception {

}

abstract class BaseClazz {
    public BaseClazz() throws CannotOpenException{
        
    }
    public void read() throws CannotReadException {

    }

    public void write() throws CannotWriteException {

    }
}
class SubClazz extends BaseClazz{

    public SubClazz() throws CannotOpenException,CannotReadException,CannotWriteException {
        //构造方法必须包含基类异常,但是可以抛出其他任何异常
    }

    @Override
    public void read() throws CannotReadException {
        super.read();//必须并且只能和基类的异常一样
    }

    @Override
    public void write()  {
        //如果不調用super方法,可以不抛出基本的异常
    }
    
}

你可能感兴趣的:(Java异常)