关键:反常是运转时过错。反常处理使得程序能够处理运转时过错,而且持续一般的履行。
在程序运转过程中,假如JVM检测出一个不或许履行的操作,就会呈现运转时过错(例如,运用一个越界的下标拜访数组等)。在Java中,运转时过错会作为反常抛出。反常便是一种现象,标明阻挠正常运转的过错或情况。假如反常没有被处理,那么程序将会非正常停止。那么怎么处理反常使得程序能够持续运转或许高雅的停止呢?
1.2 反常处理概述
关键:反常是从办法抛出的。办法的调用者能够捕获以及处理该反常。
榜首种办法是运用逻辑,判别或许呈现的过错(例如:除数为0),给出提示(提示语)以及接下来的操作(放入循环中从头输入或完毕输入)
第二种便是咱们的反常机制了。
办法怎么告诉它的调用者一个反常产生了呢?Java能够让一个办法抛出一个反常,该一场能够被调用者捕获和处理。如下例:
import java.util.Scanner;
public class QuotientWithException{
public static int quotient(int number1,int number2) {
if(number2==0) {
throw new ArithmeticException("Divisor cannot be zero");//反常类创立的反常目标并抛出,调用catch块
}
return number1/number2;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter two Integers: ");
int number1 = input.nextInt();
int number2 = input.nextInt();
try {
int result = quotient(number1,number2);//这里边或许要抛出反常
System.out.println(number1+" / "+number2+" is "+result);
}catch(ArithmeticException ex){
System.out.println("Divisor cannot be zero");//反常处理办法
}
System.out.println("OK~");
}
}
这样编译器就不会报错,而是当发作指定的动作抛出指定过错类型然后履行你指定的动作。A8站源码交易平台
1.3 反常类型
关键:反常是目标,而目标都选用类来界说,反常的根类是java.lang.Throwable.能够经过承继Exception或许其子类来创立
这些反常类能够分为三种首要类型:体系过错、反常和运转时反常。
(1)体系过错
体系过错(System Error)是由Java虚拟机抛出的,用Error类(内部体系过错)标明,这样的过错很少发作,假如发作,除了告诉用户以及尽量保险地停止程序外,简直什么也不能做。
(2)反常(Exception)
反常是用Exception类标明的,它描绘的是由你的程序和外部环境所引起的过错,这些过错能被程序捕获和处理。
(3)运转时反常(Runtime Exception)是用RunTimeException类标明的,它描绘的是程序规划过错,例如过错的类型转化等。
Runtime Exception、Error以及它们的子类都称为免检反常。一切其他反常都称为必检反常,编译器强制程序员查看并经过try—catch块处理它们。
2.1 关于反常处理的更多评论A8站源码交易平台
关键:反常的处理器是经过当时的办法开端,沿着办法调用链,依照反常的反向传达方向找到的。
Java的反常处理模型根据三种操作:声明一个反常、抛出一个反常和捕获一个反常。
2.1.1 声明反常 A8站源码交易平台
每个办法都有必要声明它或许抛出的必检反常的类型。这称为声明反常。除了Error和RuntimeException,其他反常都有必要在办法头中显式声明。这样办法的调用者才会被奉告有反常。
在办法中声明一个反常,就要在办法头中运用关键字throws:
public void myMethod() throws IOException,Exception2,...n
关键字throws标明mvMethod,或许会抛出它后边的那些反常列表里的反常
留意:假如父类中的办法没有声明反常,那么就不能在子类中对其重写时声明反常
2.1.2 抛出反常A8站源码交易平台
检测到过错的程序能够创立一个适宜的反常类型的实例并抛出它,这称为抛出一个反常。
IllegalArgumentException ex = new IllegalArgumentException ("Wrong Argument");//反常描绘信息可选
throw ex;
或许
throw new IlleagalArgumentException("Wrong Argument");
留意:声明反常的关键字是throws,抛出反常的关键字是throw
2.1.3 捕获反常
当抛出一个反常时,能够在try—catch块中捕获或处理它。假如try块中的某条句子抛出一个反常,Java就会越过try中剩下的句子,然后开端查找处理这个反常的代码。处理这个反常的代码称为反常处理器,能够从当时办法开端,沿着办法调用链,依照反常的反向传达方向找到这个处理器。从榜首个到最后一个逐一查看catch块,判别在catch块中的反常类实例是否是该反常目标的类型,假如是,就将该反常目标赋值给所声明的变量。然后履行catch中的代码。假如没有发现反常和其处理器,Java就会退出这个办法,然后把反常传给这个办法的调用者。父类的反常类型也有必要比子类的反常类型规模大。
2.1.4 从反常中获取信息 A8站源码交易平台
2.1.5 finally字句
关键:不管反常是否发作,finally字句总会被履行
有时分,不管反常是否发作,都期望履行某些代码,Java的finally字句能够用来完成这个意图。
语法结构:
try {
statements;
}catch(TheException ex){
handling ex;
}
finally {
finalStatements;
}
三种情况:(1)try中没有反常(2)try中有反常被捕获(3)try中有一场没有被捕获
上面三种情况finally块均履行。
2.1.6 何时运用反常
关键:当过错需求被办法的调用者处理的时分,办法应该抛出一个反常。
try块包含正常情况下履行的代码,catch块下是反常情况需求处理的代码,反常处理将过错处理代码从正常的编程使命中分离出来,但由于反常处理需求沿着办法调用链来传达反常,所以需求更多的时刻和资源。应该创立一个反常目标并抛出,假如能在发作反常的办法中处理反常,那么就不需求抛出或运用反常。
一般来说,一个项目中多个类都会发作的一同反常应该考虑规划为一个反常类。关于简略过错,最好进行部分处理(if-else),无须抛出反常,当有必要处理不行意料的过错情况时应运用try-catch,否则用逻辑测验去处理,不要容易糟蹋体系资源。
2.1.7 从头抛出反常
关键:假如反常处理器不能处理一个反常,或许仅仅简略地期望它地调用者留意到该反常,Java答应该反常处理器从头抛出反常。
try{
statements;
}catch{TheException ex}{
perform operations before exits;
throws ex;
}
句子throw ex从头抛出反常给调用者,以便调用者的其他处理器处理反常ex的时机。
2.1.8 链式反常
关键:与一个反常一同抛出一个反常,构成链式反常。
public static void main(String args[]) {
try {
method1();
}
catch(Exception ex){
ex.printStackTrace();
}
}
public static void method1() throws Exception{
try {
method2();
}catch(Exception ex) {
throw new Exception("new Info from method2",ex);
}
}
public static void method2() throws Exception{
throw new Exception("new Info from method1");
}
method1办法把method2办法的反常包装成了簇新的反常,新反常被抛出,在main中被捕获,进行打印,先打印新反常,在打印meithod2中的原始反常。
2.1.9 创立自界说反常
关键:能够经过承继java,lang,Exception类来界说一个自界说反常类。
由于Java现已供给了相当多的反常类,那么尽量运用它们,假如遇到不能用预界说类来充沛描绘问题,那么就能够经过集成类来创立自己的反常类。
public class InvalidRadiusException rxtend Exception{
private double radius;
public InvalidRadiusException (double radius){
super("Invalid radius"+radius);
this.radius = radius;
}
}
其间是重写了的反常信息。
A8站源码交易平台