当前位置:天才代写 > tutorial > JAVA 教程 > Java编程中异常处理惩罚的黑白之道

Java编程中异常处理惩罚的黑白之道

2017-11-12 08:00 星期日 所属: JAVA 教程 浏览:283

副标题#e#

Java编程中的异常处理惩罚是一个很常见的话题了,险些任何一门先容性的Java课程城市提到异常处理惩罚。不外,我认为许多人其实并没有真正把握正确处理惩罚异常环境的要领和计策,最多也就不外相识个或许,知道点观念。本文就对三种差异水和善质量的Java异常处理惩罚举办了接头,所叙述的处理惩罚异常的方法按手法的高下分为:

好,欠好和恶劣三种。

同时向你提供了一些办理这些问题的能力。

首先表明一些java异常处理惩罚中必需搞清楚的界说和机制。Java语言类型将自Error类或RuntimeException类衍生出来的任何违例都称作“不行查抄”(Unchecked)异常;其他所有异常则称作“可查抄”(Checked)异常。

所谓可查抄异常,是指我们应该自行处理惩罚的异常。至于处理惩罚的手段,要么加以节制(try catch),要么告示(throws)他们有大概发生。凡是,应捕获那些已知如那里理惩罚的异常,而告示那些不知如那里理惩罚的异常。

而对那些不行查抄异常来说,他们要么在我们的节制之外(Error),要么是我们首先就不应答允的环境(RuntimeException).

至于异常的指定,Java的法则很是简朴:一个要领必需告示本身大概发生的所有可查抄异常。编写本身的要领时,并不必然要告示出要领实际大概发生的每一个异常工具,要想领略什么时候必需要要领的throws丛句来告示异常,就必需知道对一个异常来说,他只有大概在下面四种环境下才会发生:

1.挪用了大概发生异常的要领。好比BufferedReader类的readLine要领。该要领告示java.io.IOException异常

2.侦测到一个错误,并用throw语句发生异常。

3.呈现一个编程错误。好比a[-1] = 0。

4.Java发生内部错误。

假如呈现头两种环境之一,必需汇报规划利用本身要领的人:如果利用这个要领,大概造成一个异常的发生(即在要领头上利用throws),一个简朴的影象要领:

只要含有throw,就要告示throws。假如一个要领必需同时处理惩罚多个异常,就必需在头内指出所有异常。就像下例展示的那样,用逗号对他们举办支解:

class Animation
{
   public Image loadImage(Strint s) throws EOFException,MalformedURLException
   {
    …………
   }
}

 

然而,我们不需要告示内部java错误,也不该该告示自RuntimeException衍生出来的异常。

好的异常处理惩罚

好异常处理惩罚提供了处理惩罚措施错误的统一机制。事实上,Java语言通过向挪用者提出异常告诫的方法而显著地晋升了软件开拓中的异常处理惩罚本领。这种方法把Java语言中的“要领(method)”举办了扩展和加强,使之包罗了自身的错误条件。下面就让我们看一个例子,这个例子说明白这种环境。

以下是FileInputStream结构器之一的原型:

public FileInputStream(String name) throws FileNotFoundException Java

的要领和结构器必需声明他们在被挪用时大概“扔出”的异常,回收的要害字就是“throws”。这种在要领原型中呈现的异常提示增加了编程的靠得住性。

显而易见,这种方法是向要领的挪用者提示了大概呈现的异常条件,这样挪用者就可以对这些异常作出适当的相应处理惩罚。以下代码示意我们是如何捕捉而且处理惩罚FileNotFoundException 这一异常的:

try 
{
   FileInputStream fis = new FileInputStream(args[0]);
   // other code here ...
}
catch (FileNotFoundException fnfe)
{
   System.out.println("File: " + args[0] + " not found. Aborting.");
   System.exit(1);
}

Java异常处理惩罚尚有其他一些优秀的特性,这就是可查抄异常、用户界说异常和在JDK 1.4中推出的新型Java记录API(Java Logging API)。java.lang.Exception的所有子类都属于可查抄异常。可查抄异常(checked exception)是扔出该异常的要领所必需提示的异常,这种异常必需被捕捉可能向挪用者提示。用户界说异常(User-defined exceptions)是定制的异常类,这种异常类扩展了java.lang.Exception类。优良的Java措施划定定制异常封装、陈诉和处理惩罚他们本身独占的环境。最新的Java记录API(logging API)则可以会合记录异常。


#p#副标题#e#

欠好的Java异常处理惩罚

欠好的一面包罗两种环境:滥用不行查抄异常(unchecked exceptions)和滥用catchall结构器等。这两种方法都使得问题变得巨大起来。

有一种类此外异常属于RuntimeException的子类,这种异常不会受到编译器的查抄。好比,NullPointerException和 ArrayStoreException就是这种范例异常的实例。措施员可以对RuntimeException举办子类化以回避查抄异常的限制,从而便于发生这些异常的要领为其挪用者所利用。

专业的开拓团队该当只答允在很少的环境下才可以这样做。

第二种异常处理惩罚的成规是catchall结构器。所谓的“catchall 结构器”就是一种异常捕捉代码模块,它可以处理惩罚所有扔给它的大概异常。

以下是catchall处理惩罚器的实例:

try
{
   // code here with checked exceptions
}
catch (Throwable t)
{
   t.printStackTrace();
}

#p#分页标题#e#

我得认可,我本身在编写一般措施的时候就曾经用过这种技能;可是,在编写要害措施的时候这种范例的结构器必然要制止利用,除非他们被授权可以和中央错误处理惩罚器连系利用才可以这样做。

除此之外,catchall结构器不外只是一种通过制止错误处理惩罚而加速编程进度的机制。

异常处理惩罚的一个不敷之处是难以回收优良的错误处理惩罚计策。从低容内存状态规复、写入错误和算法错误等异常环境都不是等闲能获得办理的。你可以实验一下轮回、垃圾收集和提醒用户等常用技能来应付以上的排场。

恶劣的处理惩罚要领

和很多Java特性及其API雷同,Java的异常处理惩罚机制也有“霸王硬上弓”类的风趣错误。例如说,为了扔出某个异常竟然绝不踌躇地用“new”要害词为其分派内存就是这样的例子。

我本身不知道有几多次就因为犯了这种错误而在严肃的编译器眼前频频碰鼻。在这种环境下,我们其实都是在伺候语言而不是让语言为我们所用。尚有我们遇到的OutOfMemoryErrors就是异常处理惩罚的缺陷。这一处理惩罚进程是:

利用finally模块封锁文件,理会异常以获得呈现问题的要领和代码行。在这一进程之内最大的缺陷是需要捕捉OutOfMemoryError,而这一异常却并不是可查抄异常!想想看,内存耗尽是相当常见的环境。任何与内存利用状态细密相关的措施都该当捕捉和处理惩罚这一错误。

利用异常时的一些发起

1.异常节制的设计宗旨并不是用来取代一些简朴的测试。只有在异常环境下才利用异常!

2.不要过度细化异常。不要在每个语句上都加上异常处理惩罚,最好将整个任务都放在try块内。假如个中有一项操纵失败,可以随即放弃任务。

3.不要“压制”异常。对付需要告示异常的要领,我们可以改用捕获的要领来将异常强行封锁,假如然的呈现异常,谁人异常会被“静暗暗”的忽略。假如以为发生的异常会很是重要,就必需多费些工夫,对其举办正确的节制。

4.不要介怀异常的通报。假如挪用的要了解发生异常,好比readLine要领,他们天生就能捕获本身大概发生的异常,在这种环境下,一种更好地做法是将这些异常通报出去,而不是本身动手来捕获它。

 

    关键字:

天才代写-代写联系方式