对于JAVA中异常的一些基础总结

JAVA中异常是什么呢?

本人认为异常是程序代码出现错误,导致编译器无法继续编译而产生的错误。即报错现象。本人之前学过一些C,认为这个类似于C中的数组下标越界,括号不匹配等等。
JAVA中的异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。这种机制可以让我们对自己写的程序作出合理的处理,而不至于程序的崩溃。

异常的体系结构

JAVA把异常当做对象来处理,并定义了一个基类java.lang.Throwable作为所有异常的超类。它有两个重要的子类:Exception(异常)和 Error(错误),二者都是 JAVA异常处理的重要子类,各自都包含大量子类。
在这里插入图片描述
Error类对象由JAVA虚拟机生成并抛出,大对数的错误与代码编写者所执行的操作无关。

Exception类对象一般分为如下两种情况:
1、RuntimeException类(运行时异常)极其子类表示JVM在运行期间可能出现的错误。比如说试图使用空值对象的引用、数组下标越界。这类异常一般是由程序逻辑错误所引起的。

2、IOException类(编译时异常),必须对该异常进行处理,否则编译不通过。在程序中,通常不会自定义该类异常,而是直接使用系统提供的异常类。

Error和Exception的区别:Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,JAVA的虚拟机一般会选择终止线程。而Exception通常情况下是可以被程序处理而解决的。

异常处理机制

异常处理的五个关键字:
try,catch,finally,throw,throws

// An highlighted block
try{
//try监控区域
}
catch(异常类型 e){
//catch捕获异常
}
finally{
//finally块里的语句不管异常是否出现,都会被执行
}

这里本人举一个小的例子:

// An highlighted block
public class Test {
	public static void main(String[] args) {
		int a = 1;
		int b = 0;
		System.out.println(a/b);
		System.out.println("Hello!");
	}
}

在这里插入图片描述
这里编译器终止了程序,并没有去执行输出Hello。如果这里用到try—catch语句,我们看看程序是否会进行下去。

public class Test {
	public static void main(String[] args) {
		int a = 1;
		int b = 0;
		try{
			System.out.println(a/b);
		}catch(Exception e){//对于我们不知道的异常类型,可以使用Exception
			e.printStackTrace();//打印错误的栈信息
			System.out.println("除数不可以为0!");
		}finally {//处理善后工作
			System.out.println("finally");
		}
		System.out.println("Hello!");
	}
}

在这里插入图片描述
这样问题就得到了解决。在try—catch语句中,我们可以添加多个catch代码块,可以对try代码块进行不同类型异常的捕获。需要注意的是,当catch捕获了第一个异常后,便不会进行后面异常的捕获。这里我们举一个例子说明。

public class Test {
	public static void main(String[] args) {
		int a = 1;
		int b = 0;
		int c[]= new int [4];//生成一个长度为4的整型数组
		try{
			System.out.println(a/b);
			c[4]=1;
		}catch(ArithmeticException e){//由之前的例子,我们可以得到异常的类型为ArithmeticException
			e.printStackTrace();//打印错误的栈信息
			System.out.println("除数不可以为0!");
		}
		catch(ArrayIndexOutOfBoundsException e){//ArrayIndexOutOfBoundsException为数组下标越界的异常
			e.printStackTrace();//打印错误的栈信息
			System.out.println("数组下标产生越界!");
		}
		finally {//处理善后工作
			System.out.println("finally");
		}
		System.out.println("Hello!");
	}
}

在这里插入图片描述
我们从输出的结果可以得到,程序并没有走到第二个catch代码块。当我们修改除数的值,使其为1时。我们得到:
在这里插入图片描述
这里我们发现,程序执行了第二个catch代码块。同时try中的输出a/b的语句还是运行了,如果将该语句放在对数组赋值之后,那么便不会执行了。这里对可以对我们catch代码块的编写进行了梳理。

而对于throwthrows这两个关键字,我们一般在方法中使用,如下代码:

public class Test1 {
	public static void main(String[] args) {
		int a[]= new int [4];
		try{
			new Test1().test(a, 4 ,3);//给a[4]赋值为3
		}catch(ArrayIndexOutOfBoundsException e){
			e.printStackTrace();
		}
		System.out.println("Hello");
	}	
	//假设在方法体内无法处理这个异常,方法上抛出异常
	public void test(int a[], int b, int c) throws ArithmeticException{//给a[b]赋值为c
		if(b>=a.length) {//throw  throws
			throw new ArrayIndexOutOfBoundsException();//方法体内主动的抛出异常
		}
	}
}

在这里插入图片描述
这里就是方法上抛出异常,需要注意的是抛出异常之后必须要对其进行捕获与处理。并且,在main方法中抛出异常,便无法处理。

自定义异常

使用JAVA内置的异常可以描述在编程时出现的大部分异常。除了这些异常外,用户还可以自己定义自己的异常类,只需要继承Exception类即可。
首先,先去定义一个异常类,我们在该对象中重写其toString方法。

public class MyException extends Exception{
	
	//传递的数字不属于0~100之间
	private int zzh;
	
	public MyException(int a) {//构造函数
		this.zzh=a;
	}
	
	//这里我们重写toString,toString:异常的打印信息
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "传递的数字不在0~100之间";
	}
}

然后我们去新建一个测试类,在该类中去捕获该异常。

public class Test3 {
	
	public static void main(String[] args) {
		try {
			test(101);	
		}catch(MyException e){
		System.out.println("MyException->"+e);//这里的e输出为MyException中重写的toString方法
		}
	}
	
	//这里我们要去写一个可能存在异常的方法
	static void test(int a) throws MyException{
		if (a<0||a>100) {
			throw new MyException(a);//抛出
		}
		System.out.println("ok");
	}

}

在这里插入图片描述
得到的结果如上图所示,这就是简单的编写一个用户自定义的异常类。大家也可以去尝试一下编写其他的自定义异常,进行捕获与处理。

小结

这是本人的第一篇博客,在编写的时候,我发现还是对前段所学的基础知识进行了补充与完善。这可能就是写博客的好处吧。异常可能在以后本人研究生开发项目阶段用到的较多,这里进行了一个小小的总结。本人初学JAVA,才学疏浅。希望能够帮助到新学习JAVA的同学。

猜你喜欢

转载自blog.csdn.net/weixin_44503406/article/details/107908573