关键字:
try:执行可能产生异常的代码
catch:捕获异常
finally:无论是否发生异常代码总能执行
throws:声明方法可能要抛出的各种异常
throw:手动抛出自定义异常
异常处理:try-catch-finally&&throw、throws
try-catch-finally
情况一(正常运行,无异常):
执行try,执行finally,执行finally块后的语句
情况二(try中出现异常)
执行到异常语句时(不执行try中异常语句之后的语句),直接跳到catch块,然后执行finally,再执行finally之后的语句
package stringdem;
import java.util.Scanner;
public class Exceptiondemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = 0;
double avg = 0;
System.out.println(" 要计算几个整数的平均值呢:");
int num = sc.nextInt();
int a[] = new int[num];
for (int i = 0; i < a.length; i++) {
try {
System.out.println("请输入第" + (i + 1) + "个数");
a[i] = sc.nextInt();
if (a[i] < 0) {
throw new Exception();
}
sum = sum + a[i];
} catch (Exception e) {
System.out.println(" N必须是正数或者0");
i = i - 1;
}
}
System.out.println("平均数="+sum/num+"总数=" + sum);
}
}
代码块中有return:
try中含有return:
a.无异常(执行顺序):
1.return之前的代码 2.finally 3.return语句 4.执行完成(不会执行return之后语句,也不会执行finally块之后的语句)
b.有异常(执行顺序):
1.异常之前与异常代码 2.catch语句 3.finally块 4.finally块之后语句 5.执行完毕(因为异常直接跳到catch块,所以try中return不会执行)
catch中含有return
a.无异常(执行顺序):
1.执行try代码块 2.执行finally块 3.执行finally之后的语句 4.退出(无异常,所以不执行catch,直接执行finally)
b.有异常(执行顺序):
这里有两种情况
情况一(异常匹配到的代码块中有return):
1.执行try块(异常语句后的try语句均不执行)2.执行catch块return之前的语句 3.执行finally块 4.执行catch中的return语句 5.退出
情况二(异常匹配到的代码块无有return,catch在其他chtch块中)
执行到异常语句时(不执行try中异常语句之后的语句),直接跳到catch块,然后执行finally,再执行finally之后的语句
catch块的执行原理:
对于异常的捕获,可以有多个catch,对于try发生的异常,他会根据发生的异常和catch里面的异常类型进行匹配(按照catch块从上往下匹配,但并不会执行不匹配的catch块语句),当他匹配到某个catch块时,他就直接进入这个catch块内,忽略这个catch块后面的所有catch块,所以,一般将catch(Exception e)放在最后,catch块承先子类后父类排列。
注意:无论是否发生异常,异常是否匹配,均会执行finally块,阻止finally执行的唯一方法是在catch块中调用 System.exit(1) 语句(System.exit(1)表示非正常退出程序)。
throw和throws
自定义异常:
第一步:若需要自定义异常名字,需新建一个类MyException,并让它继承Exception;重写构造方法,
若不需要自定义异常名字,则可以略过第一步,在第二步直接书写 throw new Exception(“”);
public class MyEcxeption extends Exception {
public MyEcxeption(String message) {
super(message);
}
}
第二步:在你需要的类中引用他(需要用关键字throw),注意,在引用类必须抛出这个异常
public void setSex(String sex) throws MyException{
if (sex.equals("男") || sex.equals("女") ){
this.sex = sex;
}else {
throw new MyException("性别必须为男或女");
}
}
throw与throws的区别:
throw自行定义并抛出异常,位于方法体内部,只可以跟一个异常对象
throws抛出异常,位于方法参数列表后,可以跟多个异常类
`