Java异常的详细概述
一、异常的概念及体系结构
异常:
就是程序出现了不正常的情况。
体系结构:
Throwable 是Java语言中所有错误或异常的父类
1 Error:严重问题,不需要处理
2 Exception
RuntimeException:
在编译期是不处理的,在程序运行时候出现了问题,需要我们回来修改代码。
非RuntimeException:
在编译期就必须处理,否则程序不能通过编译,就更不能正常的执行了。
二、JVM针对异常的默认处理方式
JVM默认异常处理方式:
1让程序停止执行
2把异常的名称,异常的原因,异常出现的位置等信息在控制台输出
代码:
public class ExceptionDemo2 {
public static void main(String[] args) {
System.out.println("程序开始执行");
method();
System.out.println("程序结束执行");
}
public static void method() {
int a = 10;
int b = 0;
System.out.println(a/b);
}
}
上面的代码报的异常是ArithmeticException,如下图:
异常信息分为三部分:
1、
异常处理类:包名+类名,java.lang是包名,ArithmeticException是类名2、
打印异常原因:不能被0整除3、
异常出现的位置
三、异常处理方案try_catch
格式:
try {
可能出现异常的代码;
}catch(异常类名 变量名) {
异常的处理代码;
}
执行流程:
1程序从try开始执行,执行到哪里出现了问题,就会跳转到catch里面执行。
2执行完毕后,程序还能继续往下执行。
public class ExceptionDemo3 {
public static void main(String[] args) {
System.out.println("程序开始执行");
method();
System.out.println("程序结束执行");
}
public static void method() {
try{
int a = 10;
int b = 0;
System.out.println(a/b);
}catch(ArithmeticException e) {//类似于show(Cat c)
e.printStackTrace();
}
//程序还会继续向下执行
}
}
四、编译时异常和运行时异常的区别
区别:
编译时异常:Java程序必须显示处理,否则程序就会发生错误的一个提示,无法通过编译。
继承者 java.lang.Exception
继承者 java.text.ParseException
如果一个异常类继承Exception的话,它就属于编译时异常
运行时异常:Java程序无需显示处理,要等到运行时出错了,再回来修改。
也可以和编译时异常一样处理。
继承者 java.lang.Exception
继承者 java.lang.RuntimeException
继承者 java.lang.IndexOutOfBoundsException
如果一个异常类继承RuntimeException的话,
它就属于运行时异常
public class ExceptionDemo4 {
public static void main(String[] args) {
System.out.println("程序开始执行");
//method();
method2();
System.out.println("程序结束执行");
}
//编译时异常ParseException
public static void method() {
try{
//String s = "2088-08-08";
String s = "abcd";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}catch(ParseException e) {
e.printStackTrace();
}
}
//运行时异常
public static void method2() {
try{
int a = 10;
int b = 0;
System.out.println(a/b);
}catch(ArithmeticException e) {
e.printStackTrace();
}
}
}
五、异常处理方案throws【应用】
throws用法:
方法() throws 异常类名
例如: void method() throws IOException
注意:
1编译时异常时必须要进行处理的,两种处理方案:try…catch…或者throws
如果你采用了throws这种方案,将来谁调用,还得进行处理。
2运行时异常可以不用处理,出现问题后我们需要回来修改代码。
public class ExceptionDemo5 {
public static void main(String[] args) {
System.out.println("程序开始执行");
try {
method();
} catch (ParseException e) {
e.printStackTrace();
}
method2();
System.out.println("程序结束执行");
}
//编译时异常
public static void method() throws ParseException {
String s = "2088-08-08";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
//运行时异常
public static void method2() throws ArithmeticException {
int a = 10;
int b = 0;
System.out.println(a/b);
}
}
六、一些常见的异常类
异常类名 | 说明 |
java.lang.ArithmeticException | 算术运算异常,例如:“除以零”的整数会抛出 |
NullPointerException | 空指针异常,例:调用一个null对象的实例方法 |
ClassCastException | 类型强制转换异常,例:Object x = new Integer(0); System.out.println((String)x); |
ArrayIndexOutOfBoundsException | 数组下标越界异常, 例:索引为负数或大于或等于数组的大小 |
NegativeArraySizeException | 创建一个大小为负数的数组错误异常,例:创建一个负数大小的数组。 |
SecturityException | 违背安全原则异常,例:由安全管理员抛出,表示安全违规。 |
NumberFormatException | 字符串转换为数字异常,例:int a=(String)“abc” |
SQLException | 操作数据库异常, 例:提供有关数据库访问错误 或其他错误的信息 |
IOException | 输入输出异常, 例:由失败或中断的I / O操作产生的 一般异常类 |
NoSuchMethodException | 方法未找到异常, 例:无法找到特定方法时抛出 |
IndexOutOfBoundsExecption | 下标越界异常,例:某种索引(例如数组,字符串或向量)的索引超出范围 |
SystemException | 系统异常,例:由于任何CORBA操作调用而抛出 |
NumberFormatException | 数据格式异常,例:抛出表示应用程序已尝试将字符串转换为其中一个数字类型 |
ConcurrentModificationException | 并发修改异常,例:一个线程通常不允许修改集合,而另一个线程正在遍历它 |
InterruptedException | 线程中断异常,例:线程在等待,睡眠或以其他方式占用时抛出,线程在活动之前或活动期间中断 |
ParseException | 解析异常,例:时间格式转换出现错误 |
IllegalThreadStateException | 违法的线程状态异常。当线程尚未处于某个方法的合法调用状态,而调用了该方法时,抛出异常。 |
InstantiationException | 实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。 |
TypeNotPresentException | 类型不存在异常。当应用试图以某个类型名称的字符串表达方式访问该类型,但是根据给定的名称又找不到该类型是抛出该异常。该异常与ClassNotFoundException的区别在于该异常是unchecked(不被检查)异常,而ClassNotFoundException是checked(被检查)异常。 |
UnsupportedOperationException | 不支持的方法异常。指明请求的方法不被支持情况的异常。 |
七、个人总结
其实,当我们遇到异常的时候,首先不要慌!因为每一个异常都有它存在的道理,我们应该冷静下来看看异常的原因和异常出现的位置,然后通过层层分析解决bug,所以,我认为异常是我们最好的老师,是我们提升技术的奠基石,有句话说得好:没有bug,你不是一个合格的程序员。
好了,JAVA异常的详细阐述就到这里了,大家有什么讨论的可以随时留言,谢谢大家哈!!!