文章目录
异常详解
import org.omg.CORBA.portable.ApplicationException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.rmi.AlreadyBoundException;
import java.rmi.activation.ActivationException;
import java.util.zip.DataFormatException;
/**
* 异常:
* Exception 实现了 throwable接口,表示所有的异常都是可以抛出的
*
* Exception的子类是有:
* 1.Exception 的直接子类,如流方面的异常,类不存在等,这种直接子类,称为编译时异常
* 2.Exception 的子类,有一个RunTimeException 的各种子类,是运行时异常
*
*
*
* 1.运行时异常
* 2.编译时异常
*
*
* 1.运行时异常:
* 在编写代码的时候,需要预先处理的异常,底层throw了一个异常,但是不需要try cathc 和throws,使用的时候考虑这种异常
* 发生的概率低
* 2.编译时异常:
* 在编写的时候需要预先处理,底层thorw了一个异常,需要try catch 或者throws ,使用的时候考虑这种异常发生的概率高
*
try catch 的详解:
建议的方式: 这个会捕捉到异常,try里面写执行的语句块,
catch 后面括号是捕捉到的异常,可以范围更大,不能更小,依次catch 多个异常的时候,之能从小到大一次catch
不建议的方式: 一个catch里面可以写多个异常用 | 隔开,处理这个异常的时候,必须在try里面有出现相应异常的方法
才能这样,try里面没有出现异常的方法,你不能凭空捕捉,但是运行时异常可以凭空捕捉,但是运行时异常没有需要
处理的必要,同时这样的并行的处理异常的方式不可靠,需要精细化处理,使用多个catch处理多个异常,而不是一个catch里面
用多个| 隔开多个异常一起处理
try catch的流程:
当出现异常的时候,出现异常的部分,如果是抛出,则直接抛出,异常下面的部分不会执行,会走处理异常的流程
如果是catch 就catch 执行catch里面的部分,在try里面异常下面的部分仍然不会执行,处理完异常,catch后面的程序会依次执行
try 和finally
try 不能单独执行,起码要和finally一起执行
finally也不能单独执行,必须和try一起执行,finally 是一定会执行的,除非在这之前阻塞了线程,或者停止了jvm,
finally是一定会执行的,然后return是执行之后方法 一定结束的,程序的执行顺序一定是从上到下的,
这里的执行顺序一般是指的是 class文件反编译过来的源文件,finally在反编译之后是在return前面的,但是
在最初的源文件,finally可以写在return之后,
*
*
*
*
*
*
*
*
*
*
*
*
*/
public class ExceptionTest {
//自定义一个异常的类
//继承了Exception 是一个编译时异常,考虑的概率较高,自定义异常,只需要写两个构造方法就行了
//运行时异常和编译时异常的抛出方法是一样的,都是需要手动昂throw抛出,但是 运行时异常不需要throws处理,也不需要try catch
static class MyException extends Exception {
public MyException(String message) {
super(message);
}
public MyException() {
}
}
//覆盖测试
static class Cat extends Animal {
@Override
public void doSome() throws ActivationException,AlreadyBoundException,ApplicationException,MyException {
//覆盖的方法在抛出异常的时候,只能抛出,父类异常的子类异常,或者父类异常本身,或者不抛出(个数不限制)
}
//自定义异常抛出测试
public void sum(int c) throws MyException {
//这个异常首先是在一定的条件下触发的,这里定义条件,然后异常是需要手动throw 抛出,和throws 不同,这里需要throw一个new的异常
//异常里面可以跟一个String类型的信息,这个信息是异常的getMassaget方法可以拿到的信息
if (c < 100) {
throw new MyException("参数小于100");
}
}
public int finallyTest() {
int c=100;
try {
return c;
}finally {
c++;
}
}
}
//覆盖测试
static class Animal {
public void doSome() throws DataFormatException,Exception {
//这是编译时异常,子类不能抛出更大范围的异常
}
}
public static void main(String[] args){
Cat cat = new Cat();
try {
cat.sum(20);
new FileInputStream("asdf");
} catch (MyException|FileNotFoundException e) {
e.printStackTrace();//这个方法打印异常的栈信息,提示异常出现的位置,建议使用这个方法,下面的方法使用意义不大,简单的获取提示信息没啥用,不能定位到出现异常的位置
System.out.println(e.getMessage());//这个getMessage方法拿到提前填入的提示信息
//处理异常的打印的各种信息,都是独立的线程来完成的
}
System.out.println(cat.finallyTest());
//这里返回的是100,还是101 呢,结果是100,结果一定是100,
//反编译之后,是j=c; 然后 C++ c是101 ,return j,最终返回的是j
}
}