目录
2、写继承关系(Exception或者RuntimeException)
一、异常是什么
程序可能出现的问题,程序在执行过程中发生了不正常的情况
二、异常的分类
1、运行时异常
也叫未受控异常,RuntimeException本身和子类
2、编译时异常
也叫受控异常,直接继承Exception,需要直接处理
注意:所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。
package csdn.Exception;
public class ExceptionDome1 {
public static void main(String[] args){
String time="2023年5月21日";
//编译时异常(必须要手动处理,否则代码报错)
System.out.println(by(4,3));
System.out.println(by(4,0));
//ArithmeticException算数运算异常
//运行时异常
}
public static int by(int a,int b){
return a/b;
}
}
三、异常处理
1、虚拟机默认处理异常
将异常信息以红色字体打印在控制台,并结束程序
2、捕获
try…catch 自己处理,一般用于调用处,能让代码继续往下运行
格式:
try{ 可能出现异常的代码; }catch(异常类名 变量名){ 异常的处理代码; }
package csdn.Exception;
public class ExceptionDome4 {
public static void main(String[] args){
int[] arr={1,2,3};
try{
System.out.println(arr[0]);
//无异常
System.out.println(arr[3]);
//此处出现异常,程序就会在这里创建一个ArrayIndexOutOfBoundsException对象
//new ArrayIndexOutOfBoundsException();
//拿着这个对象到catch的小括号中对比,看括号中的变量是否可以接收这个对象
//如果能被接收,表示该异常被捕获了,执行catch里的代码
//当catch中的代码执行完毕,执行后面的代码
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("出现了越界!!!");
e.printStackTrace();
//把异常的错误信息打印在控制台,不会停止程序进行
}
System.out.println("处理后,后续代码能执行");
}
}
注意:
1、catch小括号中的类型可以是具体的异常类型,也可以是该异常类型的父类类型
2、catch写多个的时候,从上到下,必须遵守从小到大
3、如果try中没有问题,程序将try中所有代码执行,不会执行catch中的代码
4、try中有多个问题,可以写多个catch与之对应,注意父类写在下面
3、抛出
throw throws 在方法声明处使用throws关键字抛出,谁调用就抛给谁,让该方法结束运行并告诉调用者出现了问题
格式:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{
throw new 异常类名();
}
package csdn.Exception;
public class ExceptionDome5 {
public static void main(String[] args){
int[] arr={};
int max=Max(arr);
System.out.println(max);
}
public static int Max(int[] arr)/*运行时异常,这里可写可不写throws NullPointerException*/{
if(arr==null){
//创建异常对象,将这个异常交给方法调用着处理
throw new NullPointerException();
}
int max=arr[0];
for(int i=1;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
}
return max;
}
}
自定义异常
1、定义异常类
2、写继承关系(Exception或者RuntimeException)
3、空参构造
4、带参构造(带String)
例如(定义一个NameException异常类)
package csdn.Exception;
//定义异常类
//继承关系
public class NameException extends RuntimeException{
//运行时:RuntimeException 由于参数错误导致的问题
//编译时:Exception 核心:提醒检查本地信息
public NameException() {
} //空参构造
public NameException(String message) {
super(message);
}//带参构造
}