Java的异常处理及应用_第1页
Java的异常处理及应用_第2页
Java的异常处理及应用_第3页
Java的异常处理及应用_第4页
Java的异常处理及应用_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——Java的异常处理及应用Java的奇怪处理及应用

Java奇怪处理是使用Java语言举行软件开发和测试脚本开发时不容忽略的问题之一,是否举行奇怪处理直接关系到开发出的软件的稳定性和刚强性。本文系统的阐述了Java奇怪处理的原理和方法,并列举了一些实例,使读者对Java奇怪处理能有一个全面的熟悉,理解奇怪处理机制,能更加生动和有效地在开发中使用它。下面是我为大家带来的关于Java的奇怪处理及应用的学识,接待阅读。

Java奇怪处理引出

假设您要编写一个Java程序,该程序读入用户输入的一行文本,并在终端显示该文本。

程序如下:

1importjava.io.*;

2publicclassEchoInput

3publicstaticvoidmainStringargs[]

4System.out.printlnEntertexttoecho:;

5InputStreamReaderisr=newInputStreamReaderSystem.in;

6BufferedReaderinputReader=newBufferedReaderisr;

7StringinputLine=inputReader.readLine;

8System.out.printlnRead:+inputLine;

9

10

分析上面的代码,在EchoInput类中,第3行声领略main方法;第4行提示用户输入文本;第5、6行设置BufferedReader对像连接到InputStreamReader,而InputStreamReader又连接到标准输入流System.in;第7行读入一行文本;第8行用标准输出流System.out显示出该文本。

外观看来上面的程序没有问题,但实际上,EchoInput类完全可能展现问题。要在调用第7行的readLine方法时正确读取输入,这几种假设都务必成立:假定键盘有效,键盘能与计算机正常通信;假定键盘数据可从操作系统传输到Java虚拟机,又从Java虚拟机传输inputReader。

大多数处境下上述假设都成立,但不尽然。为此,Java采用奇怪方法,以应对可能展现的错误,并采取步骤举行更正。在本例中,若试图编译以上代码,将看到以下信息:

Exceptioninthreadmainjava.lang.Error:Unresolvedcompilationproblem:

UnhandledexceptiontypeIOException

atEchoInput.mainEchoInput.java:7

从中可以看到,第7行调用readLine方法可能出错:若果真如此,那么产生IOException来记录故障。编译器错误是在报告您,需要更改代码来解决这个潜在的问题。在JDKAPI文档中,可以看到同样的信息。我们可以看到readLine方法,如图1所示。

“捕获catch”指当readLine方法产生错误时截获该错误,并处理和记录该问题。而“声明declare”指错误可能引发IOException,并通知调用该方法的任何代码:可能产生奇怪。

若要捕获奇怪,务必添加一个特殊的“处理代码块”,来接收和处理IOException。于是程序改为如下:

1importjava.io.*;

2publicclassEchoInputHandle

3publicstaticvoidmainStringargs[]

4System.out.printlnEntertexttoecho:;

5InputStreamReaderisr=newInputStreamReaderSystem.in;

6BufferedReaderinputReader=newBufferedReaderisr;

7try

8StringinputLine=inputReader.readLine;

9System.out.printlnRead:+inputLine;

10

11catchIOExceptionexc

12System.out.println“Exceptionencountered:”+exc;

13

14

15

新添的代码块包含关键字try和catch第7,10,11,13行,表示要读取输入。若告成,那么正常运行。若读取输入时错误,那么捕获问题由IOException对象表示,并采取相应措施。在本例,采用的处理方式是输出奇怪。

若不打定捕获IOException,仅声明奇怪,那么要更加指定main方法可能出错,而且更加说明可能产生IOException。于是程序改为如下:

1importjava.io.*;

2publicclassEchoInputDeclare

3publicstaticvoidmainStringargs[]throwsIOException

4System.out.printlnEntertexttoecho:;

5InputStreamReaderisr=newInputStreamReaderSystem.in;

6BufferedReaderinputReader=newBufferedReaderisr;

7StringinputLine=inputReader.readLine;

8System.out.printlnRead:+inputLine;

9

10

从上面的这个简朴的例子中,我们可以看出奇怪处理在Java代码开发中不能被忽略。

Java奇怪以及奇怪处理

可将Java奇怪看作是一类消息,它传送一些系统问题、故障及未按规定执行的动作的相关信息。奇怪包含信息,以将信息从应用程序的一片面发送到另一片面。

编译语言为何要处理奇怪?为何不在奇怪展现位置随时处理概括故障?由于有时候我们需要在系统中交流错误消息,以便按照统一的方式处理问题,有时是由于有若干处理问题的可能方式,但您不知道使用哪一种,此时,可将处理奇怪的任务嘱托给调用方法的代码。调用者通常更能了解问题来源的上下文,能更好确实定恢复方式。

奇怪本身表示消息,指发送者传给接收者的数据“负荷”。首先,奇怪基于类的类型来传输有用信息。好多处境下,基于奇怪的类既能识别故障本因并能更正问题。其次,奇怪还带有可能有用的数据如属性。

在处理奇怪时,消息务必有接收者;否那么将无法处理产生奇怪的底层问题。

在上例中,奇怪“产生者”是读取文本行的BufferedReader。在故障展现时,将在readLine方法中构建IOException对象。奇怪“接收者”是代码本身。EchoInputHandle应用程序的try-catch布局中的catch块是奇怪的接收者,它以字符串形式输出奇怪,将问题记录下来。

Java奇怪类的层次布局

在我们从总体上了解奇怪后,我们理应了解如何在Java应用程序中使用奇怪,即需要了解Java类的层次布局。

在Java中,全体的奇怪都有一个共同的祖先Throwable可抛出。Throwable指定代码中可用奇怪传播机制通过Java应用程序传输的任何问题的共性。

Throwable有两个重要的子类:Exception奇怪和Error错误,二者都是Java奇怪处理的重要子类,各自都包含大量子类。

Exception奇怪是应用程序中可能的可预料、可恢复问题。一般大多数奇怪表示中度到轻度的问题。奇怪一般是在特定环境下产生的,通常展现在代码的特定方法和操作中。在EchoInput类中,当试图调用readLine方法时,可能展现IOException奇怪。

Error错误表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVMJava虚拟机展现的问题。例如,当JVM不再有持续执行操作所需的内存资源时,将展现OutOfMemoryError。

Exception类有一个重要的子类RuntimeException。RuntimeException类及其子类表示“JVM常用操作”引发的'错误。例如,若试图使用空值对象引用、除数为零或数组越界,那么分别引发运行时奇怪NullPointerException、ArithmeticException和ArrayIndexOutOfBoundException。

Java奇怪的处理

在Java应用程序中,对奇怪的处理有两种方式:处理奇怪和声明奇怪。

处理奇怪:try、catch和finally

若要捕获奇怪,那么务必在代码中添加奇怪处理器块。这种Java布局可能包含3个片面,

都有Java关键字。下面的例子中使用了try-catch-finally代码布局。

1importjava.io.*;

2publicclassEchoInputTryCatchFinally

3publicstaticvoidmainStringargs[]

4System.out.printlnEntertexttoecho:;

5InputStreamReaderisr=newInputStreamReaderSystem.in;

6BufferedReaderinputReader=newBufferedReaderisr;

7try

8StringinputLine=inputReader.readLine;

9System.out.printlnRead:+inputLine;

10

11catchIOExceptionexc

12System.out.printlnExceptionencountered:+exc;

13

14finally

15System.out.printlnEnd.;

16

17

18

其中:

try块:将一个或者多个语句放入try时,那么表示这些语句可能抛出奇怪。编译器知道可能要发生奇怪,于是用一个特殊布局评估块内全体语句。

catch块:当问题展现时,一种选择是定义代码块来处理问题,catch块的目的便在于此。catch块是try块所产生奇怪的接收者。根本原理是:一旦生成奇怪,那么try块的执行中止,JVM将查找相应的JVM。

finally块:还可以定义finally块,无论运行try块代码的结果如何,该块里面的代码确定运行。在常见的全体环境中,finally块都将运行。无论try块是否运行完,无论是否产生奇怪,也无论是否在catch块中得四处理,finally块都将执行。

try-catch-finally规矩:

务必在try之后添加catch或finally块。try块后可同时接catch和finally块,但至少有一个块。

务必遵循块依次:若代码同时使用catch和finally块,那么务必将catch块放在try块之后。

catch块与相应的奇怪类的类型相关。

一个try块可能有多个catch块。若如此,那么执行第一个匹配块。

可嵌套try-catch-finally布局。

在try-catch-finally布局中,可重新抛出奇怪。

除了以下处境,总将执行finally做为终止:JVM过早终止调用System.exitint;在finally块中抛出一个未处理的奇怪;计算机断电、失火、或遇到病毒攻击。

声明奇怪

若要声明奇怪,那么务必将其添加到方法签名块的终止位置。下面是一个实例:

publicvoiderrorProneMethodintinputthrowsjava.io.IOException

//Codeforthemethod,includingoneormoremethod

//callsthatmayproduceanIOException

这样,声明的奇怪将传给方法调用者,而且也通知了编译器:该方法的任何调用者务必遵守处理或声明规矩。声明奇怪的规矩如下:

务必声明方法可抛出的任何可检测奇怪checkedexception。

非检测性奇怪uncheckedexception不是务必的,可声明,也可不声明。

调用方法务必遵循任何可检测奇怪的处理和声明规矩。若笼罩一个方法,那么不能声明与笼罩方法不同的奇怪。声明的任何奇怪务必是被笼罩方法所声明奇怪的同类或子类。

Java奇怪处理的分类

Java奇怪可分为可检测奇怪,非检测奇怪和自定义奇怪。

可检测奇怪

可检测奇怪经编译器验证,对于声明抛出奇怪的任何方法,编译器将强制执行处理或声明规矩,例如:sqlExecption这个奇怪就是一个检测奇怪。你连接JDBC时,不抓获这个奇怪,编译器就通不过,不允许编译。

非检测奇怪

非检测奇怪不遵循处理或声明规矩。在产生此类奇怪时,不确定非要采取任何适当操作,编译器不会检查是否已解决了这样一个奇怪。例如:一个数组为3个长度,当你使用下标为3时,就会产生数组下标越界奇怪。这个奇怪JVM不会举行检测,要靠程序员来判断。有两个主要类定义非检测奇怪:RuntimeException和Error。

Error子类属于非检测奇怪,由于无法预知它们的产生时间。若Java应用程序内存缺乏,那么随时可能展现OutOfMemoryError;起因一般不是应用程序的特殊调用,而是JVM自身的问题。另外,Error一般表示应用程序无法解决的严重问题。

RuntimeException类也属于非检测奇怪,由于普遍JVM操作引发的运行时奇怪随时可能发生,此类奇怪一般是由特定操作引发。但这些操作在Java应用程序中会频繁展现。因此,它们不受编译器检查与处理或声明规矩的限制。

自定义奇怪

自定义奇怪是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题供给新含义。可以显示代码多个位置之间的错误的好像性,也可以区分代码运行时可能展现的好像问题的一个或者多个错误,或给出应用程序中一组错误的特定含义。例如,对队列举行操作时,有可能展现两种处境:空队列时试图删除一个元素;满队列时试图添加一个元素。那么需要自定义两个奇怪来处理这两种处境。

Java奇怪处理的原那么和忌讳

Java奇怪处理的原那么

尽可能的处理奇怪

要尽可能的处理奇怪,假设条件切实不允许,无法在自己的代码中完成处理,就考虑声明奇怪。假设人为制止在代码中处理奇怪,仅作声明,那么是一种错误和凭借的实践。

概括问题概括解决

奇怪的片面优点在于能为不同类型的问题供给不同的处理操作。有效奇怪处理的关键是识别特定故障场景,并开发解决此场景的特定相应行为。为了充分利用奇怪处理才能,需要为特定类型的问题构建特定的处理器块。

记录可能影响应用程序运行的奇怪

至少要采取一些永久的方式,记录下可能影响应用程序操作的奇怪。梦想处境下,当然是在第一时间解决引发奇怪的根本问题。不过,无论采用哪种处理操作,一般总应记录下潜在的关键问题。别看这个操作很简朴,但它可以扶助您用很少的时间来跟踪应用程序中繁杂问题的起因。

根据情形将奇怪转化为业务上下文

若要通知一个应用程序特有的问题,有必要将应用程序转换为不同形式。若用业务特定状态表示奇怪,那么代码更易维护。从某种意义上讲,无论何时将奇怪传到不同上下文即另一技术层,都应将奇怪转换为对新上下文有意义的形式。

Java奇怪处理的忌讳

一般不要疏忽奇怪

在奇怪处理块中,一项最危害的举动是“不加通告”地处理奇怪。如下例所示:

1try

2Class.forNamebusiness.domain.Customer;

3

4catchClassNotFoundExceptionexc

经常能够在代码块中看到类似的代码块。有人总热爱在编写代码时简朴快速地编写空处理器块,并“自我抚慰地”宣称打定在“后期”添加恢复代码,但这个“后期”变成了“无期”。

这种做法有什么缺陷?假设奇怪对应用程序的其他片面切实没有任何负面影响,这未尝不成。但事实往往并非如此,奇怪会扰乱应用程序的状态。此时,这样的代码无异于掩耳盗铃。

这种做法若影响较轻,那么应用程序可能展现怪异行为。例如,应用程序设置的一个值不见了,或GUI失效。若问题严重,那么应用程序可能会展现重大问题,由于奇怪未记录原始故障点,难以处理,如重复的NullPointerExceptions。

假设采取措施,记录了捕获的奇怪,那么不成能遇到这个问题。实际上,除非确认奇怪对代码其余片面绝无影响,至少也要作记录。进一步讲,永远不要疏忽问题;否那么,风险很大,在后期会引发难以预料的后果。

不要使用笼罩式奇怪处理块

另一个危害的处理是笼罩式处理器blankethandler。该代码的根本布局如下:

1try

2//…

3

4catchExceptione

5//…

6

使用笼罩式奇怪处理块有两个前提之一:

1.代码中只有一类问题。

这可能正确,但即便如此,也不应使用笼罩式奇怪处理,捕获更概括的奇怪形式有利物弊。

2.单个恢复操作始终适用。

这几乎十足错误。几乎没有哪个方法能放之四海而皆准,能应对展现的任何问题。

分析下这样编写代码将发生的处境。只要方法不断抛出预期的奇怪集,那么一切正常。但是,假设抛出了未预料到的奇怪,那么无法看到要采取的操作。当笼罩式处理器对新奇怪类执行千篇一律的任务时,只能间接看到奇怪的处理结果。假设代码没有打印或记录语句,那么根本看不到结果。

更糟糕的是,当代码发生变化时,笼罩式处理器将持续作用于全体新奇怪类型,并以一致方式处理全体类型。

一般不要把特定的奇怪转化为更通用的奇怪

将特定的奇怪转换为更通用奇怪时一种错误做法。一般而言,这将取消奇怪起初抛出时产生的上下文,在将奇怪传到系统的其他位置时,将更难处理。见下例:

1try

2//Error-pronecode

3

4catchIOExceptione

5Stringmsg=Ifyoudidn’thaveaproblembefore,youdonow!;

6thrownewExceptionmsg;

7

由于没有原始奇怪的信息,所以处理器块无法确定问题的起因,也不知道如何更正问题。

不要处理能够制止的奇怪

对于有些奇怪类型,实际上根本不必处理。通常运行时奇怪属于此类范畴。在处理空指针或者数据索引等问题时,不必求助于奇怪处理。

Java奇怪处理的应用实例

在定义银行类时,若取钱数大于余额时需要做奇怪处理。

定义一个奇怪类insufficientFundsException。取钱withdrawal方法中可能产生奇怪,条件是余额小于取额。

处理奇怪在调用withdrawal的时候,因此withdrawal方法要声明抛出奇怪,由上一级方法调用。

奇怪类:

classInsufficientFundsExceptionextendsException

privateBankexcepbank;//银行对象

privatedou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论