我们知道java的异常处理机制分为使用try-catch-finally捕获和使用throws声明抛出异常,但是需要遵循一定的捕获原则。
1.异常处理要遵循的原则
1)先捕获子类异常再捕获父类异常。
例如:
try{
Class.forName("com.test.HelloWorld");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse("2020-10-abc");
System.out.println(100/0);
}catch(ClassNotFoundException ex){
ex.printStackTrace();
}catch(ParseException ex){
ex.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
2)方法重写时,子类不能抛出比父类范围更大的异常。 例如:
class Father{
public void fn() throws ClassNotFoundException{
Class.forName("com.test.Father");
}
}
class Son extends Father{
/*
@Override
public void fn() throws Exception { //错误,方法重写时子类不能比父类更大的异常
super.fn();
}*/
//子类可以抛出与父类相同的异常或者是父类异常的子类。
@Override
public void fn() throws ClassNotFoundException{
super.fn();
}
}
2.自定义异常
最简单的Java自定义异常就是创建一个类,继承自Exception,重写它的构造方法;具体代码如下:
public class MyException extends Exception{
//此处可以换成其他的异常列:NumberFormatException,ArithmeticException,RuntimeException
public MyException (){
}
public MyException (String str){
//此处传入的是抛出异常后显示的信息提示
super(str);
}
}
重写后抛出异常代码:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入一个正整数:");
try {
int num1 = scanner.nextInt();
if(num1<0){
throw new MyException("错误!输入数据为负数。");
}
} catch (MyExceptione) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
小结:
1).java的要捕获要遵循以下原则,A.先捕获子类异常再捕获父类异常。B.方法重写时子类不能抛出比父类更大的异常。
2).通过继承Exception类实现自定义异常类。