|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
net程序员的大部门代码都靠控件拖拽完成的,虽然java也有,但是无论从美观和速度上都没发和.net比。java程序员都是代码完成的,所以java程序员常戏称.net程序员是操作员,呵呵。<P> Java供应了两类次要的非常:runtimeexception和checkedexception。一切的checkedexception是从java.lang.Exception类衍生出来的,而runtimeexception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的。
它们的分歧的地方体现在两方面:机制上和逻辑上。
1、机制上
它们在机制上的分歧体现在两点:1.怎样界说办法;2.怎样处置抛出的非常。请看上面CheckedException的界说:
publicclassCheckedExceptionextendsException
{
publicCheckedException(){}
publicCheckedException(Stringmessage)
{
super(message);
}
}
和一个利用exception的例子:
publicclassExceptionalClass
{
publicvoidmethod1()
throwsCheckedException
{
//...thrownewCheckedException(“...堕落了“);
}
publicvoidmethod2(Stringarg)
{
if(arg==null)
{
thrownewNullPointerException(“method2的参数arg是null!”);
}
}
publicvoidmethod3()throwsCheckedException
{
method1();
}
}
你大概已注重到了,两个办法method1()和method2()城市抛出exception,但是只要method1()做了声明。别的,method3()自己其实不会抛出exception,但是它却声明会抛出CheckedException。在向你注释之前,让我们先来看看这个类的main()办法:
publicstaticvoidmain(String[]args)
{
ExceptionalClassexample=newExceptionalClass();
try
{
example.method1();
example.method3();
}
catch(CheckedExceptionex){}example.method2(null);
}
在main()办法中,假如要挪用method1(),你必需把这个挪用放在try/catch程序块傍边,由于它会抛出Checkedexception。
比拟之下,当你挪用method2()时,则不必要把它放在try/catch程序块傍边,由于它会抛出的exception不是checkedexception,而是runtimeexception。会抛出runtimeexception的办法在界说时不用声明它会抛出exception。
如今,让我们再来看看method3()。它挪用了method1()却没有把这个挪用放在try/catch程序块傍边。它是经由过程声明它会抛出method1()会抛出的exception来制止如许做的。它没有捕捉这个exception,而是把它传送下往。实践上main()办法也能够如许做,经由过程声明它会抛出Checkedexception来制止利用try/catch程序块(固然我们否决这类做法)。
小结一下:
*Runtimeexceptions:
在界说办法时不必要声明会抛出runtimeexception;
在挪用这个办法时不必要捕捉这个runtimeexception;
runtimeexception是从java.lang.RuntimeException或java.lang.Error类衍生出来的。
*Checkedexceptions:
界说办法时必需声明一切大概会抛出的checkedexception;
在挪用这个办法时,必需捕捉它的checkedexception,否则就得把它的exception传送下往;
checkedexception是从java.lang.Exception类衍生出来的。
2、逻辑上
从逻辑的角度来讲,checkedexceptions和runtimeexception是有分歧的利用目标的。checkedexception用来唆使一种挪用方可以间接处置的非常情形。而runtimeexception则用来唆使一种挪用方自己没法处置或恢复的程序毛病。
checkedexception迫使你捕捉它并处置这类非常情形。以java.net.URL类的构建器(constructor)为例,它的每个构建器城市抛出MalformedURLException。MalformedURLException就是一种checkedexception。假想一下,你有一个复杂的程序,用来提醒用户输出一个URL,然后经由过程这个URL往下载一个网页。假如用户输出的URL有毛病,构建器就会抛出一个exception。既然这个exception是checkedexception,你的程序就能够捕捉它并准确处置:好比说提醒用户从头输出。
再看上面这个例子:
publicvoidmethod()
{
int[]numbers={1,2,3};
intsum=numbers[0]numbers[3];
}
在运转办法method()时会碰到ArrayIndexOutOfBoundsException(由于数组numbers的成员是从0到2)。关于这个非常,挪用方没法处置/改正。这个办法method()和下面的method2()一样,都是runtimeexception的情况。下面我已提到,runtimeexception用来唆使一种挪用方自己没法处置/恢复的程序毛病。而程序毛病一般是没法在运转过程当中处置的,必需更正程序代码。
总而言之,在程序的运转过程当中一个checkedexception被抛出的时分,只要可以得当处置这个非常的挪用刚刚应当用try/catch来捕捉它。而关于runtimeexception,则不该当在程序中捕捉它。假如你要捕捉它的话,你就会冒如许一个风险:程序代码的毛病(bug)被掩饰在运转傍边没法被发觉。由于在程序测试过程当中,体系打印出来的挪用仓库路径(StackTrace)常常使你更快找到并修正代码中的毛病。有些程序员倡议捕捉runtimeexception并记录在log中,我否决如许做。如许做的害处是你必需经由过程扫瞄log来找出成绩,而用来测试程序的测试体系(好比UnitTest)却没法间接捕捉成绩并呈报出来。
在程序中捕捉runtimeexception还会带来更多的成绩:要捕捉哪些runtimeexception?甚么时分捕捉?runtimeexception是不必要声明的,你如何晓得有无runtimeexception要捕捉?你想看到在程序中每次挪用办法时,都利用try/catch程序块吗?
JAVA学习必须明确这是一项投资,对于大多数的人来说,学习JAVA是为了就业,还有就是刚走向工作位置的朋友想尽快赶上工作的节奏。 |
|