java语言基础之异常详解

异常就是程序在运行时出现的错误。

为了程序的健壮性,在出现异常的时候,我们要对异常进行处理。

异常主要产生原因:

1.用户输入数据错误

2.访问的文件不存在

3.网络通信链接中断

4.jvm内存溢出


在发生异常事件的时候,会抛出一个异常对象。该对象封装了一个异常事件的信息,并交给java运行时系统,这个过程叫做:抛出。

Error错误是程序员处理不了的异常。

RuntimeException异常类是可以处理也可以不处理的异常。

IOException异常类是必须要处理的异常,否则编译不过。

Throws与throw用法的区别:

throws是一种方法可能抛出异常的声明。他定义在方法名上:可以写出好多种并行的可能产生的异常类

	void test() throws RuntimeException,Exception
 {
		System.out.println("3/0="+(3/0));
}

但是他真的只是抛出而并没有进行异常处理。。

throw用于主动抛出的异常的语句前。他定义在方法体中

	void test(int i) throws RuntimeException,Exception {
		if(i==0) {
			throw new RuntimeException("wrong");
		}
		System.out.println("3/0="+(3/0));	
	}

throw表示该处抛出了一个异常<后边new了一个异常对象>

而throws表示这个方法可能会抛出一个异常。

两者都没有进行异常处理。那产生异常该交给谁处理呢?


try--catch语句用来处理异常的语句

try

{        ...可能会产生异常的语句...

 语句一          //哪句出异常的话,下面的语句就不会再执行了,直接跳转到指定异常类型的catch语句

 语句二

  ...

}

catch(...异常类1和对象名...){

...处理异常的方法...  //通常是 getMessage();  printStackTrace();

}catch(...异常类2和对象名...){

...处理异常的方法...  //通常是 getMessage();  printStackTrace();

}

finally{

...该异常机制的统一出口,肯定会被执行<即使有return语句>... //通常为关闭文件删除临时文件等方法

}

这里有个小tip:

/*	void test1() {
		try {
			System.out.println("3/0="+3/0);
		}catch(Exception aw) {   //大的异常类型
			aw.getMessage();
		}
		catch(RuntimeException ae){  //小的异常类型
			System.out.println(ae.getMessage());
		}
	}*/       》》》报错喽
	
-----------------------------------华丽的分割线---------------------------	
	/*	void test1() {
		try {
			System.out.println("3/0="+3/0);
		}catch(RuntimeException ae){   //小的异常类型
			System.out.println(ae.getMessage());
		}catch(Exception aw) {     //大的异常类型
			aw.getMessage();
		}   》》》安逸啊
	}*/

上面有两组try-catch语句,都拥有两个catch语句,只是位置不同。

大的异常类型在前,小的在后的话,会报错。


发现个有趣的代码可以加深对异常对象的理解:

	void test(int i) {
		if(i==1) {
			throw new RuntimeException("wrong");
		}
		try {
			System.out.println("3/0="+3/0);
		}catch(RuntimeException ae){
			//小的异常类型
			System.out.println("小异常");
			System.out.println(ae.getMessage());
			ae.printStackTrace();
		}catch(Exception aw) { 
			System.out.println("大异常");
			System.out.println(aw.getMessage());//大的异常类型
                     aw.printStackTrace();
}}测试代码:
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        TestE d = new TestE();
        try {
        	  d.test(0);
        }catch(Exception ar) {
        	ar.printStackTrace();
        	System.out.println("here is wrong");
        }
        System.out.println("oula");
	}
运行结果:

异常处理完后,异常对象就被垃圾回收器回收啦!<测试代码中catch都捕获不到异常了,所以没运行>。

总之:throws抛出异常------try-catch解决异常变得正常------finally必须做善后工作


关于重写与异常的理解

记住两句话:

1,子类重写父类方法要抛出与父类一致的异常,或者不抛出异常

2,子类重写父类方法所抛出的异常不能超过父类的范畴

个人理解是一种约束力。比如孩子继承了父亲的缺点<异常>,因为父亲可能会意识到自己的部分缺点,教育并约束自己的孩子。所以孩纸的缺点只会比父亲少,最坏的情况是和父亲的缺点一样



yes,Zard! 异常部分,完结撒花~ 明天搞多线程的基础知识部分。

猜你喜欢

转载自blog.csdn.net/weixin_42126680/article/details/80316720
今日推荐