Java中异常机制的几点思考

本文详细介绍了Java中的异常处理机制,包括编译期对异常处理的语法检查、方法间异常传播的规则,以及如何通过抛出异常、捕获处理异常或避免调用异常方法来解决编译错误。

1.对异常处理的语法检查是在编译期进行的,而非运行期。也就是说即使某抛出了异常但未被正确处理的方法,在执行期并未被真正调用,也会编译出错。如下面的
ExtendExcepDemo1.java代码中,Test类中建立了A类的对象a,并调用了a的方法show(),尽管在main()函数中并未调用function1,但仍会在编译期间出错。

//ExtendExcepDemo1.java代码
class AException extends Exception
{
}

class A
{
	public void show() throws AException
	{
		System.out.println("Hello AException!");
	}
}

class Test
{
	void function1() //throws AException 第一种方法:抛出异常
	{

		A a=new A();
		a.show();
		// a.show();   第三种方法:不调用show()方法
/*		第二种方法:捕获异常并处理
		try
		{
			A a=new A();
			a.show();
		}
		catch (AException a)
		{
		}
*/
	}
	void function2()
	{
		System.out.println("Hello rui");
	}
}


class ExtendExcepDemo1 
{
	public static void main(String[] args)
	{
		Test t=new Test();
		t.function2();
		
	}
}


解决编译出错的方法有以下三种:如代码中注释部分
一是抛出异常;
二是捕获并处理异常;
三是取消对方法show()的调用。
其中第三种方法也表明,异常的抛出与处理是针对方法的,尽管建立了A类对象,但只要不调用异常相关的方法,仍然不会编译出错。

2.一个方法若抛出了异常,那么任何调用该方法的方法都必须抛出异常或捕获异常(但当其中的某一级方法捕获并处理异常后,之后再调用该方法便无需处理异常)。
如ExtendExcepDemo1.java代码中,由于A类的show()方法抛出了异常,那么在Test类中的function1方法若调用了show()方法,就必须抛出异常或捕获AException异常。
(1)若function1方法选择抛出异常,那么ExtendExcepDemo1类中的main()函数就必须抛出异常(给虚拟机)或捕获异常并处理,参考ExtendExcepDemo2.java中的代码:

//ExtendExcepDemo2代码
class AException extends Exception
{
}

class A
{
	public void show() throws AException
	{
		System.out.println("Hello AException!");
	}
}

class Test
{
	void function1() throws AException
	{
		A a=new A();
		a.show();
	}
	void function2()
	{
		System.out.println("Hello rui");
	}
}


class ExtendExcepDemo2 
{
	public static void main(String[] args) throws AException
	{
		Test t=new Test();
		t.function2();
		
	}
}


(2)若function1方法捕获并处理异常,那么ExtendExcepDemo1类中的main()函数就无需再对异常做任何抛出或捕获操作,参考ExtendExcepDemo3.java中的代码: 

//ExtendExcepDemo3代码
class AException extends Exception
{
}

class A
{
	public void show() throws AException
	{
		System.out.println("Hello AException!");
	}
}

class Test
{
	void function1() 
	{
		try
		{
			A a=new A();
			a.show();
		}
		catch (AException e)
		{
		}
	}
	void function2()
	{
		System.out.println("Hello rui");
	}
}


class ExtendExcepDemo3 
{
	public static void main(String[] args) 
	{
		Test t=new Test();
		t.function2();
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值