异常处理
- 异常处理机制可以使程序的异常处理代码和正常业务代码分离
- 抛出异常:try内的业务逻辑块出现异常时,系统自动生成一个异常对象,该异常对象被提交给java运行时的环境
- 捕获异常:java运行环境收到异常对象时,会寻找处理该异常对象的catch块,如果找到就把该对象交给catch快处理。如果找不到捕获异常的catch块,就退出java程序
-
java将异常处理封装成一个个类,类与类之间的继承关系为:
-
Throwable是Error和Exception的超类
-
Error 系统级错误,(包括outofMemeryError,StackOverflowError)
-
Exception 可修复异常
- 其他exception(非运行时异常,编译期异常),IOException,SQLExpection
- RuntimeException(运行时异常)
- NullPointerException ,空指针
- ArrayIndexOutOfBuoundsException ,数组下标越界
- ArithmeticException ,算数异常(除数为零)
- ClassCastException ,类强制转换时可能会异常,当想把对象强制转化为不是实例的子类时抛出异常
- InputMismatchException ,处理用户输入错误的提示
-
Error和Exception:Error错误一般是与虚拟机相关,如系统崩溃,虚拟机错误。这种错误无法恢复无法捕捉,将导致程序中断。
-
finally总会执行,
- 当return和finally一起使用,但finally中没有return时,先执行return,在执行finally,最后return在返回值(返回值是在最后,但执行是在finally前面)
- 当finally中有return直接返回finally中的return,try catch中的return就不返回了
-
finally中的赋值语句不改变try-catch的返回值,(因为返回是先执行的,只是最后返回),只有finally中的returen能改变return值
try{
a = 1;
returna;
}
finally{
System.out.println("It is in final chunk.");
a = 2;
// returna;
}
//这里返回依旧是1,finally中的赋值不改变返回值
//当注释return被使用时,返回2
- try catch finally不能独立存在
- try后面可以直接加finally,try中可以继续try,catch中可以继续try,finally中可以继续try
try{
//执行的代码,
}catch(Exception e){
//try发生异常才会跳到这
}finally{
//不管什么情况都会执行,这以便能在异常处理的最后做一些清洁工作,比如关闭数据库
}
- 输入依次两个整数相加,输入错误提示用户重新输入
- 用一个循环读到int才出去,不然继续循环读
- try中nextInt读成功就就把循环条件置成false,否则就进入catch
- try中有nextInt,那么在catch中就要有nextLine(要把int残余的读走)
import java.util.InputMismatchException;
import java.util.Scanner;
public class JavaExceptionTest {
public static void main(String[] args) {
int a, b;
System.out.println(("第一个整数是:"));
a = chu();
System.out.println(("第二个整数是:"));
b = chu();
System.out.println("两个整数和是:" + (a + b));
}
public static int chu() {
boolean zhi = true;
int a = 0;
Scanner input = new Scanner(System.in);
while (zhi) {
try {
a = input.nextInt(); //输入不是int的话,这里就异常
zhi = false; //输入的是int的话就结束循环
} catch (InputMismatchException e) {
System.out.println(("输入类型不是整型的,请重新输入:"));
input.nextLine(); //把nextInt产生的换行符去掉
}
}
return a;
}
}
throw和throws
throws
- throws用来在方法定义时声明该方法要抛出的异常类型(记忆:可能在方法后面写了一系列,所以加s)
- 当方法抛出列表中的异常时,方法将不对这些异常及其子类异常做处理,而是抛向调用该方法的方法,由他去处理
- main方法调用就是系统进行异常处理
public void method() throws ArithmeticException,InptMismatchException{
}
throw
- throw抛出异常对象,并且只能抛出类Throwable或者其子类的实例对象(Error+Exception)
- 比如 throw new String()就是错的
if(age<18 || age>80){
throw new Exception("age error");
}else{
}
- 使用throw抛出异常有两种处理方法
- 方法内部自己抛出异常自己处理
- 在方法声明处用throws声明异常,谁调用谁处理(本质是因为throws)
try{
if(age<18 || age>80){
throw new Exception("age error");
}else{
System.out
}
}catch(Exception e){
}
// 2.函数声明处加throws,谁调用谁处理
public static void textAge() throws Exception{
if(age<18 || age>80){
throw new Exception("age error");
}else{
}
}
- throws和throw连用时,throw抛出的异常对象要在throws异常列表中
//这里throws列表中填的是ArithmeticException本身或者他的父类Throwable,Exception
public static int test(int a,int b) throws {
if(b==0){
throw new AritheticException{""}
}
}
- throw意思是这句代码自己手动抛出一个异常(及一定有异常)
//c#的写法
try{
Console.WriteLine("try");
throw new Exception(); //表示这里抛出一个Exception异常
}catch (Exception){
Console.WriteLine("catch");
}finally{
Console.WriteLine("finally");
}