一、Java 异常概念
异常:就是不正常,程序运行过程中出现的不正常的情况。(数组越界)
Java程序在执行过程中所发生的异常(运行时一切不正常情况)事件可分为两类
本次java异常则主要是狭义上的异常,也就是java中的Exception
(一)广义上的异常
指的是程序运行中一切不正常的情况;
Error :Java虚拟机无法解决的严重问题。如:JVM系统内部错误、内存不足等严重情况。一般不编写针对性的代码进行处理。
import java.util.ArrayList;
import java.util.Date;
public class errordemo {
public static void main(String[] args) {
/*
//集合
ArrayList arrayList = new ArrayList();
while (true){
arrayList.add(new Date());
}
*/
//sum(50000);
//StackOverflowError
}
public static int sum(int n){
if(n==1){
return 1;
}
return n+sum(n-1);
}
}
(二)狭义上的异常
狭义上的异常(Exception):也是程序运行中出现了问题,但是可以通过异常处理机制代码进行解决,解决后程序可以继续向后运行.
对于一般的异常,出现后,程序会立即终止执行, 或者 实现采用异常处理机制来进行处理。
public class exceptiondemo1 {
public static void main(String[] args) {
//1.数组越界 ArrayIndexOutOfBoundsException
/*
int []a = new int[10];
a[10]=6;
*/
//2.数字格式化异常 NumberFormatException
/*
Integer.parseInt("aa");
*/
//3.空指针异常,使用了null作为对象 NullPointerException
/*
String s = null;
s.equals("");
*/
//4.类类型转换异常 ClassCastException
/*Object obj = "abc";
Integer a = (Integer) obj;//"abc"不能转为Integer
*/
//5.算数异常 ArithmeticException
System.out.println(1/0);
/*
java中把语法中能够出现的问题种类,都封装成了一个个类来进行表示
|<----异常的类型---->| |<-异常原因->|
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.ffyc.javaexception.exceptiondemo1.main(exceptiondemo1.java:28)
|<-------异常位置------>|
//以上异常,虽然在运行期间会出现,但是编译期间并不需要强制处理-->运行时异常
//这种在编译期间,就需要我们进行强制处理的,又是异常中的一类(检查异常,编译期间异常)
// new SimpleDateFormat("").parse("");
// "abc".getBytes("utf-8");
*/
}
}
对于一般的异常,出现后,程序会立即终止执行, 或者采用异常处理机制来进行处理
分类:编译时异常和运行时异常
二、异常的体系
Throwable类有两个直接子类 Exception类、Error类
(一)Error是错误
可能是编译期出错或者系统错误,与程序无关,本章节不作介绍;
(二)Exception是异常
是所有异常类的父类,与程序息息相关,是程序员所关心的。
上面已经说过,异常分为运行期异常和编译期异常两种
编译器异常(Checked Exception):直接或间接继承Exception的类
运行期异常(RuntimeException):编写代码时,没有必要直接处理掉异常,可以做一些提示或者抛出。通常包括:
ArrayIndexOutOfBoundsException
NumberFormatException
NullPointerException
ClassCastException
ArithmeticException
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3I0WM2I-1682436836994)(C:\Users\李凯松\AppData\Roaming\Typora\typora-user-images\1682306584964.png)]
三、异常处理
(一)概括
Java编程语言使用异常处理机制为程序提供了错误处理的能力
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DrLNWKa-1682436836995)(C:\Users\李凯松\AppData\Roaming\Typora\typora-user-images\1682306663686.png)]
(二)具体实现
一般通过5个关键字来实现:
try catch finally throw throws
public class exceptiondemo4 {
public static void main(String[] args) {
/*
finally {
}
不能单独使用,必须与try{}catch(){}一起使用或者 try{}
try{
可能会出异常的代码
}catch(异常类型 引用名){
处理办法
}finally {
最后一定会执行的代码
}
==============
try{
}finally{
}
*/
System.out.println("begin");
try {
System.out.println(10/0);
}catch(ArrayIndexOutOfBoundsException arraye){
System.out.println("数组越界");
}catch(ArithmeticException ae){
System.out.println("除数为0");
}catch (NumberFormatException ne){
System.out.println("数字格式化异常");
}catch (Exception e){
System.out.println("系统繁忙");
}finally {
System.out.println("最后一定要执行的代码");
}
System.out.println("end");
}
}
(三)解释
try 检测异常的代码(发现异常)
try{}中代码发生异常,下面的代码将不再执行,程序跳转到异常处理catch(){}块中,try {}中一般为可能会出现异常的代码
catch(){} 捕获异常类型,是程序可以继续运行紧跟try{}后面,可以有多个catch语句,分别捕获不同的异常类型,父类异常类型只能写在最后一个catch块里面,否则程序会出错。
getMessage() 获取异常原因,返回字符串
/ by zero
printStackTraace() 获取异常类名和异常信息,以及异常在程序中的 位置。返回值void
java.lang.ArithmeticException: / by zero
at
com.ffyc.javaexception.exceptiondemo3.main(exceptiondemo3.java:22)
finally{} 为必须要执行的代码,同时也只能有一个finally{}语句
finally{
必须执行的代码
}
四、throws 和 throw
(一)throws
在方法定义时,进行声明的,声明此方法可能会出现某种异常.
throw
在方法体内,用来抛出一个异常对象.
可以throws 多个异常
public void test() throws 异常1,异常2,异常3{
}
1.任何方法都可以使用throws关键字声明异常类型,包括抽象方法
2.子类重写父类中的方法,子类方法不能声明抛出比父类类型更大的异常(针对编译期异常)
3.使用了throws的方法,调用时必须处理声明的异常,要么使用try-catch,要
么继续使用throws声明。
异常处理
throw关键字用于显式抛出异常,抛出的时候是抛出的是一个异常类的实
例化对象.
在异常处理中,try语句要捕获的是一个异常对象,此异常对象也
可以自己抛出
(二)throw
写在方法体内,给定某些条件,不符合是就可以使用throw抛(语句提示)
在源码中很多都是使用throws和throw处理异常,
而我们的业务代码中,出现问题,需要try catch
public class exceptiondemo8 {
public static void main(String[] args) {
try {
charAt(-1);
}catch (StringIndexOutOfBoundsException se){
System.out.println(se.getMessage());
}
}
/*
throw 是在方法体中,用来抛出一个异常对象的,
抛出后,方法相当于出现了异常
*/
public static char charAt(int index)throws StringIndexOutOfBoundsException{
if(index<0||index>10){
/*
throw new 异常类();
在方法运行过程,当不满足某种条件时,主动的在程序抛出异常对象.
*/
throw new StringIndexOutOfBoundsException("字符串下标越界:"+index);
}
return '1';
}
}
五、自定义异常
自定义异常就是自己定义的异常类,也就是API中的标准异常类的直接或间接的
子类
java语言中提供了许许多多的异常类,都是与语法相关的.
而实际的业务开发,有时,我们也需要在某种条件下以抛出异常对象的方式进行处理.
用自定义异常标记业务逻辑的异常,避免与标准异常混淆
自定义异常类中往往不写其他方法,只重载需要使用的构造方法
继承Exception,在方法中使用throw抛出后,必须在方法中try-catch或
throws抛出
public class TestScore {
public static void main(String[] args) {
try {
pingfen(101);
} catch (ScoreException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
public static char pingfen(int score) throws ScoreException {
if(score<0|score>100){
throw new ScoreException("分数不合法"+score);
}
if(score>=90&&score<=100){
return 'A';
}else if(score>=80&&score<=90){
return 'B';
}else{
return 'C';
}
}
}
自定义异常类
public class ScoreException extends Exception{
/*
自定义的异常类
满足适合条件时 抛出
*/
public ScoreException() {
}
public ScoreException(String message) {
super(message);
}
}
0&&score<=90){
return ‘B’;
}else{
return ‘C’;
}
}
}
自定义异常类
```java
public class ScoreException extends Exception{
/*
自定义的异常类
满足适合条件时 抛出
*/
public ScoreException() {
}
public ScoreException(String message) {
super(message);
}
}