异常
异常指的是在程序运行过程中发生的异常事件,通常是由外部问题(如硬件错误、输入错误)所导致的。
在Java等面向对象的编程语言中异常属于对象。
Java中所有错误和异常的父类是java.lang.Throwable
一.Throwable体系
是所有错误和异常类的超类(祖宗类)。其有两个子类
Error类的基类是java.lang.Error(只能通过修改代码来解决问题)
Exception类是编译期异常,基类是java.lang.ExceptionRuntimeException类继承自Exception类,是运行期异常类
- Error错误
public class Error{
public static void main(String[] args) {
int[] arr = new int[1024*1024*1024];
System.out.println("后续代码");
}
}
输出结果
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Error.main(Error.java:4)
- Exception 编译期异常
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Exception {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("1999-0909");
System.out.println(date);
}
}
输出结果
Exception in thread "main" java.text.ParseException: Unparseable date: "1999-0909"
at java.base/java.text.DateFormat.parse(DateFormat.java:399)
at yichang.Exception.main(Exception.java:9)
- Exception 运行期异常
public class RuntimeException {
public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arr[3]);
}
}
输出结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at yichang.Exception.main(Exception.java:5)
二.抛出异常
关键字:throw
1.其作用是抛出异常
2.使用格式:
throw new 异常类名(参数)
三.Object非空判断
如:
public class Exception{
public static void main(String[] args){
method(null);
}
public static void method(Object obj){
if(obj == null)
{
throw new NullPointerException("传递的对象的值是null");
}
}
}
运行结果
Exception in thread "main" java.lang.NullPointerException: 传递的对象的值是null
at yichang.Exception.method(Exception.java:9)
at yichang.Exception.main(Exception.java:4)
四.异常处理
声明异常
关键字:throws
1.其作用是抛出异常的声明
2.使用格式
修饰符 返回值类型 方法名称(参数) throws异常1名称{}
throws关键字后边声明的异常必须是Exception或者是Exception的子类
throw和throws区别:
1.throw可以直接用在main方法体内。而 throws用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
2.throw如果被执行了,那么一定是抛出了某种异常了。而throws表示可能出现,但不一定。
捕获异常
1.其作用是对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理
2.格式:
try-catch
try-finally
try-catch-finally
try和catch必须同时出现,一个try可以有多个catch.
自定义异常类
在编写代码时,可以扩展Exception类定义自己的异常类,然后根据程序的需要来规定哪些方法产生这样的异常。
五.finally代码块
格式:
try{
//可能产生异常的代码
}catch(/*定义一个异常的变量,用来接收try中抛出的异常对象*/){
//异常的处理逻辑,产生异常对象之后,怎么处理异常对象
//一般在工作中,会把异常的信息记录到一个日志中
}
...
catch(/*异常类名,变量名*/){
}finally{
//无论是否出现异常都会执行
}
finally不能单独使用,必须和try一起使用
finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要资源释放(IO)
六.子父类的异常
1.如果父类抛出了多个异常,子类重与父类方法时,抛生;和父类相同的异常或者是父类异常的子类或者不抛生异常。
2.父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
3.父类异常时什么样,子类异常就什么样4.子类重写父类方法时,拋出和父类相同的异常
5.子类重写父类方法时,拉出父类异常的子类
6.子类重写父类方法时,不抛出异常
七.自定义异常
在编写代码时,可以扩展Exception类定义自己的异常类,然后根据程序的需要来规定哪些方法产生这样的异常。
格式
public class XXXException extends Exception/RuntimeException{
添加一个空参构造方法
添加一个带异常信息的构造方法
}
1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类
2.自定义异常类,必须继承Exception或者RuntimeException
继承Exception:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就必须处理这 个异常,要么throws,要么try…catch
继承RuntimeException:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)