一、异常概述
1、什么是异常?
java程序在运行时出现的不正常情况
2、java中提供的默认的异常处理机制
java中对java程序运行时可能会出现的每种不正常情况都创建了一个唯一对应的类,在java程序运行时如果出现不正常情况,java程序就会创建该种情况对应的类的对象并抛出,此类对象中包含了此情况的所有异常信息,包括异常的类型、异常的原因、异常的位置
3、注意:
(1)语法错误不是异常。程序语法错误,编译不通过,不会产生字节码文件,也就不会运行
(2)不处理异常会导致JVM的非正常停止
4、java程序中无法处理的异常
(1)在读取文件时文件被删除
(2)在进行网络通信时网络中断
二、常见异常
1、数组索引越界异常
(1)正常程序
public static void main(String[] args) {
// 1、数组索引越界异常
int[] a=new int[3];
System.out.println(a[2]);
System.out.println("你好,中国!");
}
(2)异常程序
public static void main(String[] args) {
// 1、数组索引越界异常
int[] a=new int[3];
System.out.println(a[3]);
System.out.println("你好,中国!");
}
异常位置之后的程序不会被运行
2、其它常见异常
public static void main(String[] args) {
// 1、字符串索引越界异常
String s = "abc";
System.out.println(s.charAt(3));//java.lang.StringIndexOutOfBoundsException
// 2、空指针异常
String s1 = null;
System.out.println(s1.length());//java.lang.NullPointerException
// 3、算数异常
int a = 3;
System.out.println(a / 0);//ArithmeticException
// 4、类型转换异常
Object object = "123";
Integer s2 = (Integer) object;//java.lang.ClassCastException
// 5、数字格式化异常
int b = Integer.parseInt("ab"); //java.lang.NumberFormatException
System.out.println(b);
}
三、异常体系结构
1、根类(java.lang.Throwable)
(1)public void printStackTrace() 打印栈中的异常信息
(2)public String getMessage() 获取异常信息
2、子类(java.lang.Error)
Java虚拟机无法解决的严重问题,如内存资源耗尽,一般不编写针对性代码进行处理
(1)StackOverflowError 栈溢出错误(栈内存溢出)
public class Demo {
int sum(int num){
if(num==1){
return 1;
}
return num+sum(num-1);
}
public static void main(String[] args) {
int res=new Demo().sum(1000000);
System.out.println(res);
}
}
(2)OutOfMemoryError 没有内存错误(堆内存溢出,简称OOM)
public class Demo {
public static void main(String[] args) {
List<Integer>list=new ArrayList<>();
while(true){
list.add(1);
}
}
}
3、子类(java.lang.Exception)
可以使用java中异常处理机制进行处理的一般问题
4、异常
(1)广义异常:Throwable类和其所有的子类
(2)狭义异常:Exception类
5、异常体系结构图