异常
try catch
写法:
try {
//可能产生的异常的代码区,也称为监控区
}catch (ExceptionType1 e) {
//捕获并处理try抛出异常类型为ExceptionType1的异常
}catch(ExceptionType2 e) {
//捕获并处理try抛出异常类型为ExceptionType2的异常
}
try catch final
写法:
try {
//可能产生的异常的代码区
}catch (ExceptionType1 e) {
//捕获并处理try抛出异常类型为ExceptionType1的异常
}catch (ExceptionType2 e){
//捕获并处理try抛出异常类型为ExceptionType2的异常
}finally{
//无论是出现异常,finally块中的代码都将被执行
}
执行顺序;
1、try没有捕获异常时,try代码块中的语句依次被执行,跳过catch。如果存在finally则执行finally代码块,否则执行后续代码。
2、try捕获到异常时,如果没有与之匹配的catch子句,则该异常交给JVM处理。如果存在finally,则其中的代码仍然被执行,但是finally之后的代码不会被执行。
3、try捕获到异常时,如果存在与之匹配的catch,则跳到该catch代码块执行处理。如果存在finally则执行finally代码块,执行完finally代码块之后继续执行后续代码;否则直接执行后续代码。另外注意,try代码块出现异常之后的代码不会被执行。
4、如果想让finally不执行,需要退出虚拟机,System.exit
5、finally会比return 先执行。
实例:
package Exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class TCF {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入被除数:");
try {
int numA=input.nextInt();
System.out.println("请输入除数:");
int numB=input.nextInt();
System.out.println("结果是:"+numA/numB);
}
catch(InputMismatchException e) {
System.out.println("只能输入整数.");
}
catch(ArithmeticException e) {
System.out.println("除数不能为0");
}
catch(Exception e) {
System.out.println("网络异常");
}
finally {
input.close();//关闭数据流
}
}
}
throw和throws
1、throws抛出异常
如果一个方法可能抛出异常,但是没有能力处理该异常或者需要通过该异常向上层汇报处理结果,可以在方法声明时使用throws来抛出异常。这就相当于计算机硬件发生损坏,但是计算机本身无法处理,就将该异常交给维修人员来处理。
2、throw抛出异常
在方法内,用throw来抛出一个Throwable类型的异常。一旦遇到到throw语句,后面的代码将不被执行。然后,便是进行异常处理——包含该异常的try-catch最终处理,也可以向上层抛出。注意我们只能抛出Throwable类和其子类的对象。
tips:只有在抛出RuntimeException异常的时候,throw可以单独使用。
3、可查异常:编译器要求必须处理的异常。正确的程序在运行过程中,经常容易出现的、符合预期的异常情况。一旦发生此类异常,就必须采用某种方式进行处理。除RuntimeException及其子类外,其他的Exception异常都属于可查异常。编译器会检查此类异常,也就是说当编译器检查到应用中的某处可能会此类异常时,将会提示你处理本异常——要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。
4、不可查异常:编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有try-catch捕获它,也没有使用throws抛出该异常,编译也会正常通过。该类异常包括运行时异常(RuntimeException极其子类)和错误(Error)
5、自定义异常
代码:
package Exception;
public class AgeException extends Exception {
String error;
public AgeException(){
this("年龄不能低于0岁或大于150岁!");
}
public AgeException(String error) {
super(error);
}
}
package Exception;
public class TR {
private int age;
private String name;
public TR(){
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeException{
if(age>150||age<0) {
throw new AgeException();
}
this.age = age;
}
}