异常
在Java语言中,将程序执行中发生的不正常情况称为异常(开发过程中的语法错误和逻辑错误不是异常)
异常(Exception)一般分为两类:运行时异常(非受检异常)和编译时异常(受检异常)
1、Error和Exception的区别
Error是程序无法处理的错误,它是由JVM产生和抛出的,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机一般会选择线程终止。
Exception是程序本身可以处理的异常
2、运行时异常和非运行时异常
运行时异常都是RuntimeException类及其子类异常,如ClassCastException、IndexOutOfBoundsException等,这些异常一般是由程序逻辑错误引起的.
非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如果不处理,程序就不能编译通过。如IOException等以及用户自定义的Exception异常。
异常的体系结构图
运行时异常举例
- java.lang.NullPointerException (空指针异常)
- java.lang.ArrayIndexOutOfBoundsException (数组下标越界异常)
- java.lang.NumberFormatException (数字格式异常)
- java.lang.ArithmeticException (算数异常)
- java.lang.ClassCastException (强制类型转换异常)
- java.lang.ClassNotFoundException (类找不到异常)
- java.lang.IndexOutOfBoundsException (索引下标越界异常)
- java.sql.SQLException (SQL执行异常)
- java.io.IOException (输入输出异常)
- java.lang.IllegalArgumentException (方法参数异常)
- java.lang.IllegalAccessException (无访问权限异常)
- java.lang.NoSuchMethodError (方法不存在错误)
- java.lang.InstantiationError(实例化异常)
- java.lang.LinkageError(连接错误)
- java.lang.StackOverflowError(堆栈溢出)
- java.lang.OutOfMemoryError(内存溢出异常)
运行时异常的解释
- java.lang.NullPointerException
这个异常的解释是 "程序遇上了空指针 ",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。
public void test1(){
int arr1[] =null;
System.out.println("arr1[2]");
}
- java.lang.ArrayIndexOutOfBoundsException
这个异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了
public void test2(){
int[] arr2=new int[10];
System.out.println(arr2[10]);
}
- java.lang.NumberFormatException
数字格式异常。当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。
public void test4(){
String str2="123";
str2="abc";
int num=Integer.parseInt(str2);
}
- ArithmeticException
算数异常
比如程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数 学运算的地方,公式是不是有不妥了。
public void test6(){
int a=10;
int b=0;
System.out.println(a/b);
}
- ClassCastException
类造型异常(强制类型转换异常)
public void test3(){
Object obj=new Date();
String str=(String)obj;
}
- java.lang.ClassNotFoundException
异常的解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确
错误信息:找不到该类包
首先在项目文件中没有添加相应的jar包在依赖里看是否有jar包
如果有jar包。双击打开他,如果提示已经损坏需要重新下过,重新导入
最后的原因是没有将maven工程的jar包发布到部署的项目文件中。在内置的tomcat中没有生成lib依赖
-
java.lang.IndexOutOfBoundsException
索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。 -
java.sql.SQLException
Sql语句执行异常 -
java.io.IOException
输入输出异常 -
java.lang.IllegalArgumentException
方法参数错误
很多J2ME的类库中的方法在一些情况下都会引发这样的错误,比如音量调节方法中的音量参数如果写成负数就会 出现这个异常,再比如g.setColor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异 常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。 -
java.lang.IllegalAccessException
无访问权限异常
当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情 况下要注意这个异常。 -
java.lang.NoSuchMethodError
方法不存在错误
当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。 -
java.lang.InstantiationError
实例化异常
实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常. -
java.lang.LinkageError
连接错误
链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况 -
java.lang.StackOverflowError
堆栈溢出
堆栈溢出错误,一般都是使用递归的时候层次调用太深抛出的异常。原因在于 : 无限调用递归函数, 函数是以栈帧的形式存在于虚拟机栈内存中, 一直创建栈帧, 导致栈溢出. -
java.lang.OutOfMemoryError
内存溢出异常
检查代码中是否有死循环或递归调用。
检查是否有大循环重复产生新对象实体。
检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收
或者是JVM内存设置过小,可以调大jvm内存,和优化代码,Java堆用于存储对象实例, 只要不断地创建对象, 并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制来清除这些对象, 那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常. (摘抄自深入理解java虚拟机), 所以一直new String() 并不会造成堆内存溢出.
原文引用链接:
https://blog.youkuaiyun.com/weixin_53148080/article/details/119838100
https://zhidao.baidu.com/question/585708962.html
https://blog.youkuaiyun.com/a34651714/article/details/102834548