throwable异常
异常概念
在程序运行过程中产生使程序终止正常运行的错误对象
异常类
Java异常都是Throwable的子类,是Objec类的直接子类,在java.lang包中,Throwable类有两个子类,一个是Error类,一个是Exception类
Error类是描述的系统内部错误
Exception类又分为非检查异常和检查异常,非检查异常都是RunTimeException类及其它的子类,非检查异常都是在程序运行时检测到的,编译器不对非检查异常处理(免检异常)
常见免检异常
- NullPointerException:空指针异常,当某个对象的引用为null时调用该对象的方法和使用对象就会产生异常
- ArithmeticException:算术异常,例如在做除法运算时,出书为零时产生异常
- ClassCastException:对象转换异常
- ArrayIndexOutOfBoundsExcepiton:数组下标越界异常,当引用数组元素的下标超出范围时产生的异常
- NumberFormatException:数字格式错误异常,将字符串转换成数值时,如果字符串不能正确转换成数值时产生该异常
检查异常
检查异常是除RunTimeException类及其子类以外的异常,也成为必检异常
检查异常程序必须捕获或者声明抛出,否则编译不能通过
- ClassNotFoundException:当应用程序试图使用class类中的for Name()、loadClass ()等方法通过字符串名加载类时,抛出该异常
- NoSuchMethodException:无法找到某一特定方法时,抛出该异常
- IoException:此类是失败或中断的 I/O 操作生成的异常的通用类
- SQLException:提供关于数据库访问错误或其他错误信息的异常
Error分类
VirtulMechineEror:java 虚拟机崩溃或用尽了它继续操作所需的资源时,抛出该错误
OutMemoryError:因为内存溢出或没有可用的内存提供给垃圾回收器时,Java 虚拟 机无法分配一个对象,这时抛出该异常
StackOverFolwError:当应用程序递归太深而发生堆栈溢出时,抛出该错误
ThreadDeath:调用 Thread 类中带有零参数的 stop 方法时,受害线程将抛出一个 ThreadDeath 实例,仅当应用程序在被异步终止后必须清除时才应该捕获这个类的实例
异常处理
try -catch-finally方式
public class TryTest {
public static void main(String[] args) {
try {
int x=2,y=8,result;
result=x+y;
System.out.println(result);
}
catch(Exception e) {
System.out.println(e.getMessage());
}
finally {
System.out.println("finally");;
}
}
}
- :try块将程序中可能产生异常的代码用大括号括起来,该代码块可能产生一种或者多种异常
- catch用来捕获异常,catch可以有多个,用来处理不同的异常,若有多个catch代码块且设计到父子类,父类异常放在后面,子类异常放在前面
- finally是可选项,一般用来释放资源,无论是否产生异常,该代码块都会执行
- 一个try块必须有一个catch块或者finally块,catch块或者finally块都不能单独使用,必须跟try块
throw方式
public class Example01 extends RuntimeException{//继承RuntimeException类
public void divisor(int y){
if(y==0) {
throw new ArithmeticException("除数为零");//算术异常
}
}
public static void main(String[] args){
Example01 t=new Example01();
t.divisor(0);
}
}
结果:(我只是做一个测试,ArithmeticException我没有具体去实现)
- 该方法抛出的是java源码里面自定义的方法
- 该类必须继承异常类
throws方式
class TestException extends RuntimeException{//自定义异常类
public TestException(){
System.out.println("除数为0");
}
public TestException(String message) {
super(message);
}
}
public class Example01{
public void divisor(int y)throws TestException{
if(y==0) {
throw new TestException("除数为零");
}
}
public static void main(String[] args){
Example01 t=new Example01();
t.divisor(0);
}
}
结果
- :throws是声明方法抛出异常
- :该自定义异常类必须继承异常类