java基础-异常

异常学习总结

第一部分

1、异常:异常是程序中有可能产生的错误,一旦错误产生,Java语言要么在底层使用事先定义
好的异常对象进行处理,要么由我们程序员对代码进行处理
异常的分类:Java中定义了很多异常类,每一种异常都对应一个异常类,最顶层的异常父类是Throwable,其子类是error和exception,error是底层错误,程序员无法通过代码修正,而exception可以进行处理,其次exception异常可以划分为RuntimeException和非 RuntimeException (Checked异常)。
RuntimeException: java编译器在遇见一段语法的时候没有检查出来错误,但是在运行期间发生了错误,如数组下标越界,空指针等。要求我们程序员在编码时谨慎。
非RuntimeException: 在代码编译期间虚拟机要求你必须做处理,如: IOException,SQLException
2、Java中处理异常的方式:try catch finally throws throw
语句块
  • try语句块的作用:放的是有可能产生异常的代码
注意事项:
1:try中声明的变量的作用范围仅限于try块
2:当try中的某一行代码发生异常时,Java虚拟机会 负责产生一个异常对象,然后去找代码中的catch 进行匹配处理,此时,异常代码后面的代码将不再执行
3:try语句块不能独立存在 printStackTrace 输出异常信息
  • catch语句块的作用:用来捕获Java虚拟机抛出的异常对象,然后进行处理
注意事项:
1:catch中定义的异常对象可以和Java虚拟机抛出的异常对象类型一致或者是其父类
2:catch一旦捕获到具体的异常对象则进行处理,此时try catch正常执行完成,其后的代码(指的是try catch后面的代码)会仍然执行,如果catch捕获不到,程序发生例外并退出,不再执行try catch后的代码
3:一段代码可能会产生不同的异常类型,所以需要在try后面跟上多个catch语句块, 一旦try中产生异常,程序将 按照catch定义的顺序从上往下进行匹配,匹配成功,只执行其中一条catch,其余catch将被忽略
4:养成在catch中处理异常的习惯,哪怕是输出一句话,不能什么都不做
5:catch不能独立存在,变量作用范围仅限于catch块
  • finally语句块的作用:不论代码是否产生异常,其代码块中的代码总是会被执行,除非在catch中加System.exit(0);主要用来释放资源(关闭物理资源),比如:I/O缓冲区,数据库连接
  • throws:一般用于给方法声明异常,其次使用throws给方法声明的异常,方法本身不做处理,而是交给调用者处理
  • throw: 抛出异常异常对象,通常用来自定义异常
3、Java程序中什么时候需要显式的去捕获异常?
使用throws声明的非RuntimeException异常类或者其子类的异常需要
显式捕获,而只有RuntimeException或者其子类的异常是不需要显式捕获的
4、为什么要自定义异常?
当jdk提供的异常不能满足实际开发需求时,需要自定义异常
步骤1:创建自定义异常类继承Exception,然后编写构造方法定义
异常信息字符串
步骤2:在类中使用异常,即使用throw抛出实例化的自定义异常对象
步骤3:在程序中捕获异常
5、finally代码块和finalize()方法的区别?
无论是否抛出异常,finally代码块都会执行,它主要是用来释放应用占用的资源。
finalize()方法时Object类的一个Protected方法,它是在对象被垃圾回收之前由java虚拟机来调用的。
异常处理完成后,Exception对象会在下一个垃圾回收过程中被回收掉
6、检查型异常和非检查型异常的
主要区别在于其处理方式。检查型异常需要使用try, catch和finally关键字在编译期进行处理,否则会出现编译
器会报错。对于非检查型异常则不需要这样做。
Java中所有继承自java.lang.Exception类的异常都是检查型异常
所有继承自RuntimeException的异常都被称为非检查型异常。




第二部分
常见的异常
1、NullPointerException  空指针引用异常 
当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
  • 调用 null 对象的实例方法。
  • 访问或修改 null 对象的字段。
  • 如果一个数组为null,试图用属性length获得其长度时。
  • 如果一个数组为null,试图访问或修改其中某个元素时。
  • 在需要抛出一个异常对象,而该对象为 null 时。
  • 应用程序将会抛出NullPointerException类的实例,表明其他对 null 对象的非法使用
2、 OutOfMemoryError 内存溢出异常
造成原因
  • 内存中加载的数据量过于庞大,如一次从数据库中取出过多数据
  • 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收
  • 代码中存在死循环或者循环产生过多重复的对象实体
  • 使用的第三方软件中的BUG
  • 启动参数内存值设定的过小
常见错误提示
1.tomcat:java.lang.OutOfMemoryError: PermGen space
2.tomcat:java.lang.OutOfMemoryError: Java heap space
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
3.weblogic:Root cause of ServletException java.lang.OutOfMemoryError
4.resin:java.lang.OutOfMemoryError
5.java:java.lang.OutOfMemoryError
解决方案
应用服务器提示错误的解决:把启动参数内存值设置足够大
java代码导致错误的解决:
  • 检查代码中是否有死循环或者循环调用
  • 检查是否有大量循环重复产生的新对象实体
  • 检查对数据库查询中,是否有一次获得全部数据的查询
  • 检查List、Map等集合对象是否有使用完后,未清除的问题。List、Map等集合对象会始终存有对对象的引用,这些对象不能被GC回收
3、常见的运行时异常?
- ArithmeticException(算术异常)
- ClassCastException (类转换异常)
- IllegalArgumentException (非法参数异常)
- IndexOutOfBoundsException (下标越界异常)
- NullPointerException (空指针异常)
- SecurityException (安全异常)
ArithmeticException 算术异常(除数为0时发生)
ButterOverflowException 缓冲区溢出异常














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值