异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
异常捕获结构
try{
//程序代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
finally{
//程序块
}
注意:
Exception是try代码传递给catch代码块的变量类型,e是变量名,catch代码块中可输出错误性质,包括以下三种:
- getMessage()函数:输出错误性质
- toString()函数:给出异常的类型和性质
- printStackTrace():指出异常的类型,性质,栈层次及出现在程序中的位置。
无论try-catch是否顺利执行完毕,都会执行finally语句。除了以下四种情况:
- 在finally语句块发生异常
- 在前面的代码中使用了System.exit()退出程序。
- 程序所在的线程死亡
- 关闭CPU
自定义异常
package com.company;
public class MyException extends Throwable {
public MyException(String ErrorMessagr) {
super(ErrorMessagr);
}
}
//测试代码
package com.company;
//创建一个带有int类型的方法avg(),该方法用于检查参数是否小于1或者大于100.
//通过throw关键字抛出MyException异常对象,并在main方法中捕获该异常。
public class Tran {
static int avg(int number1,int number2) throws MyException{
if(number1<0||number2<0){ //
throw new MyException("不可以使用负数");//错误信息
}
if(number1>100||number2>100){ //
throw new MyException("数值太大了");//错误信息
}
return (number1+number2)/2;
}
public static void main(String[] args) {
try{
int result=avg(102,150);
}catch(MyException e){
System.out.println(e);//输出异常信息
}
}
}
抛出异常
- 使用throws关键字抛出异常
通常用于声明方法时,用来指定方法可能抛出的异常
public class Shoot{
static void pop()throws NegativeArraySizeException{
int[]arr=new int[-3];
}
psvm{//简写
try{
pop();
}catch(NegativeArraySizeException e){
System.out.println("pop()方法抛出的异常");
}
}
}
- 适应throw关键字
通常用于方法体中
package com.company;
//异常捕获顺序实例
import java.lang.System;
import java.lang.ArithmeticException;
public class ExceptionOrder{
static int div(int x, int y) { //各种Exception都被捕获,函数无须声明异常
int r=0;
try{
//自己抛出异常对象
if(y==0) throw new ArithmeticException( );
r=x/y; }
catch(ArithmeticException ae) { System.out.print(ae.toString( )); throw ae; }
//处理完异常后可以继续抛出异常,交给上层调用者继续处理。注意即使这里抛出异常,同层的finally仍会执行
//catch子句里抛出异常,这个异常在div方法里没有处理,但是div可以不声明异常?为什么?因为ae是非必检
catch(Exception ae){//捕获各种Exception:若是第1个catch,则后续的catch子句无机会捕获
System.out.print(ae.toString( ));
}
finally{ r=-1; } //无论是否有异常,r=-1
return r;
}
public static void main(String[ ] args) {
try{ div(5, 0); } //调用div(5, 0)后,div函数的执行轨迹已用红色标出
catch(Throwable ae) { //任何异常都被捕获,包括Error类型异常
System.out.print(ae.toString( ));
//因此虽然div没有异常声明,在main里调用div也用了try/catch
}
}
}