异常:程序出现了没有足够信息能继续执行,或者不能按照正常逻辑执行
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方法,可以不抛出基本的异常
}
}
网友评论