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,如下图:

java throw 异常使用 java异常说明_Java

异常信息分为三部分:

1、

java throw 异常使用 java异常说明_java throw 异常使用_02

异常处理类:包名+类名,java.lang是包名,ArithmeticException是类名2、

java throw 异常使用 java异常说明_Java_03


打印异常原因:不能被0整除3、

java throw 异常使用 java异常说明_java throw 异常使用_04

异常出现的位置

三、异常处理方案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异常的详细阐述就到这里了,大家有什么讨论的可以随时留言,谢谢大家哈!!!