一、什么异常。
二、如何处理异常
-try-catch-finally
-throw
-throws
-自定义异常
-异常链
三、异常本质上是程序上的错误,错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误。
括号没有正常配对;语句结束后少写了分号;关键字编写错误;
①使用空对象的引用调用方法。空指针异常。
②数组越界
③除数为0
这些都是运行期间错误产生的表现。
四、在程序运行过程中,意外发生的情况,背离我们程序本身意图的表现,都可以理解为异常。通过合理的异常处理,可以更好地提高程序的健壮性。
五、Throwable是java的当中异常的根类,他有两个重要的子类:Error和Exception
Error是程序无法处理的错误,表示运行应用程序中较严重的问题。java虚拟机出现的一些列问题。
虚拟机错误、内存溢出错误、线程死锁错误。它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,及时确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。
Exception是程序本身可以处理的异常。异常处理通常指针对这种类型异常的处理。
六、在java应用程序当中,异常处理机制为:
抛出异常、捕捉异常。
当一个方法当中出现错误引发异常的时候,方法会去创建异常对象并交付给运行时系统进行处理。那这个异常对象就会包含异常类型或者 异常出现时的程序状态。
对于运行时异常、错误或可查异常,Java技术所要求的异常处理方式有所不同。
抛出异常和捕捉异常是通过5个关键字来实现的,他们分别是:try、catch、finally、throw、throws
try块后可接零个或多个catch块,如果没有catch块,则必须跟一个 finally块。
要不try catch 要不try finally 必须组合使用。
例子:当main方法执行过程的当中产生的报错,
import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
定义两个变量 输出商
//int one = 12;
//int two = 2;
//System.out.println(one/two); //6
//当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
System.out.println("===运算结束===");
}
}
当被除数输入0时,程序会报如下的异常
当除数输入一个字母,则报以下错误。(输入格式错误的异常)
虽然很简单地一个相处的因素,经过人的输入之后就有很多情况,所以需要合理进行异常处理才行。
将把可能出错的程序用try包裹起来时,
import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
定义两个变量 输出商
//int one = 12;
//int two = 2;
//System.out.println(one/two); //6
//当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
try {
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
} catch (Exception e) {
System.out.println(e);
}
System.out.println("===运算结束===");
}
}
则会打印出
在catch中可以通过e.printStackTrace()捕获追踪异常
finally包裹是无论怎么样都一定会执行的代码。
import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
定义两个变量 输出商
//int one = 12;
//int two = 2;
//System.out.println(one/two); //6
//当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
try {
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}finally {
System.out.println("===运算结束===");
}
}
}
多重catch:将代码改造成多个catch块,根据不同类型的报错做处理。
import java.util.InputMismatchException;
import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
定义两个变量 输出商
//int one = 12;
//int two = 2;
//System.out.println(one/two); //6
//当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
try {
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
} catch (ArithmeticException e) {
System.out.println("除数不允许为0");
e.printStackTrace();
} catch(InputMismatchException e) {
System.out.println("请输入数字");
e.printStackTrace();
}
finally {
System.out.println("===运算结束===");
}
}
}
catch再多的异常一般涵盖不全,所以最后一个 catch中 需要传递Exception类。也是一种安全保障机制,一定要放在最后一个catch
import java.util.InputMismatchException;
import java.util.Scanner;
public class ErrorTest {
public static void main(String[] args) {
定义两个变量 输出商
//int one = 12;
//int two = 2;
//System.out.println(one/two); //6
//当这两个变量换成键盘输入
Scanner inputScanner = new Scanner(System.in);
System.out.println("===运算开始===");
try {
System.out.println("请输入第一个整数:");
int one = inputScanner.nextInt();
System.out.println("请输入第二个整数:");
int two = inputScanner.nextInt();
System.out.println(one/two);
} catch (ArithmeticException e) {
System.out.println("除数不允许为0");
e.printStackTrace();
} catch(InputMismatchException e) {
System.out.println("请输入数字");
e.printStackTrace();
} catch(Exception e) {
System.out.println(e);
e.printStackTrace();
}
finally {
System.out.println("===运算结束===");
}
}
}
七、System.exit(1)//终止程序运行 括号里面是非0就可以
在finally块不要写return xxx。因为当catch和finally中都有return的时候,不管进了哪个catch,都return的是finally里面的值。