异常的两种处理方式、throws
1、异常的两种处理方式
1、异常上抛
在方法声明的位置上,使用throws关键字,抛给上一级
谁调用我,我就抛给谁,抛给上一级。
2、异常捕捉
使用try..catch语句进行异常的捕捉
这件事发生了,谁也不知,因为我给抓住了。
举例
我是某集团的一个销售员,因为我的失误,导致公司损失了1000块钱。"损失1000块"这可以看做一个异常发生了。我有两种处理方式。
-
第一种方式:我把这件事告诉我的领导。【异常上抛】 第二种方式:我把自己的掏腰包把这个钱补上。【异常的捕捉】
同样的异常发生之后,如果选择上抛,抛给了调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。
注意
Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常的发生,只有只有一个结果。终止java程序的执行。
2、运行时异常编写程序时可以不处理
public class ExceptionTest01 {
public static void main(String[] args) {
int a = 10;
int b = 0;
int c=a/b;
/*
程序执行到此处发生了ArithmeticException异常
底层new一个ArithmeticException异常对象
然后抛出了,由于是main方法调用了c=a/b
所以这个异常ArithmeticException抛给main方法
main方法没有处理,将这个异常自动抛给JVM
JVM最终终止程序的执行
ArithmeticException 继承 RuntimeException,属于运行时异常。
在编写程序阶段不需要对这种异常进行预先的处理。
*/
System. out.println(a + "/”+ b + "="+ c);
//这里的HelloWorld没有输出,没有执行。
System.out.println("Hello World!");//
}
}
3、方法声明上使用throws
以下代码报错的原因是什么?
因为doSome()方法声明位置上使用了:throws ClassNotFoundException 而ClassNotFoundException是编译时异常。必须编写代码时处理,没有处理编译器报错。
public class ExceptionText1 {
public static void main(String[] args) {
//main方法中调用doSome()方法
//因为doSome()方法声明位置上有:throws ClassNotFoundException
//我们在调用doSome()方法的时候必须对这种异常进行预先的处理。
//如果不处理,编译器就报错
//报错信息: 未报告的异常错误java.lang.ClassNotFoundException
doSome();
}
/**
* doSome方法在方法声明的位置上使用了:throws ClassNotFoundException
* 这个代码表示doSome()方法在执行过程中,有可能会出现ClassNotFoundException异常。
* 叫做类没找到异常。这个异常直接父类是: Exception,所以ClassNotFoundException属于编译异常。
* @throws ClassNotFoundException
*/
public static void doSome() throws ClassNotFoundException{
System.out.println("doSome!!!");
}
}
