`
青出于
  • 浏览: 12541 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java中异常机制浅谈

阅读更多
    在之前学习File类的相关操作时,我们就接触到了try……catch语句。当时只是知道为了程序执行的可能,需要对可能存在问题的语句进行“实验性的尝试”,并在问题出现是返回问题的对象。但当时并不清楚到底是怎么回事,又是为什么……
    今天龙哥终于为我们进行了指导,对于异常也有了个初步的理解~。不过也就有了这篇博文……
    首先,先说一下我对异常的理解。异常是在程序在运行过程中发生的在程序编写时无法预料到的,将阻止程序继续正常运行的事件。常见的有空指针、数组越界、栈溢出、文件找不到等等。
    C语言中,通过使用if语句来判断是否出现了异常。这种方法有C语言面对过程的特性,其中也容易产生由于对异常产生情况的估计不足而导致程序已经健壮性不足。Java是一种面向对象的高级语言,在对异常的处理机制中同样也体现出了这一点。Java在一个方法的运行过程中,如果发生了异常,则这个方法生成代表该异常(Exception类)的一个对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为抛弃(throw)一个异常。运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回朔,直到找到包含相应异常处理的方法为止,这一个过程称为捕获(catch)一个异常。
    在异常的处理中,可以使用之前的try……catch语句,也可以在程序名后加throws语句。两者的区别在于,try……catch语句是在try……catch语句结构中处理异常,直到异常的解决。throws则是将该异常产生的相应的对象抛给调用该方法的方法。这种异常的传递可以一直向上,直到交给虚拟机或者用户去解决。
    说完了异常的大致处理方式,接下来说说异常的相关类。Java作为一种面向对象的语言,异常也被当做了一种对象,而每种对象在Java中就有相关的类去定义其属性与方法。本文所涉及的异常主要是Exception类及其子类所定义的对象。我们会发现,Exception类还有一个父类,Throwable,并且有个兄弟类error类。error和Exception都是可抛出导致程序终止的对象的类,error的对象是虚拟机无法处理而直接抛出的,通常也是无法解决的。这是程序无法解决的问题。我们主要讨论通过程序能够自我解决的异常。
    异常(Exception类对象)有些是需要强制检测的,比如File类中的路径;而有些异常是虚拟机在运行程序时自动抛出的,比如空指针异常等。
    接下来就是处理异常机制中的关键字。Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally。JB的在线帮助中对这几个关
键字是这样解释的:
    Throws:   Lists the exceptions a method could throw.
   Throw:    Transfers control of the method to the exception handler.
   Try:     Opening exception-handling statement.
   Catch:   Captures the exception.
   Finally: Runs its code before terminating the program.

翻译之后:
   Throws:将异常列在一个可抛出的方法中
   Throw:将方法的控制传递给异常的掌握者(个人认为就是调用该方法的对象)
   Try:开启异常处理机制
   Catch:抓住异常(结构体内出处理方法)
   Finally:运行其代码,然后终止程序。
声明:以上翻译来自本人,靠不靠谱请自行判断……
    1、try语句 :
    try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。
    2、catch语句 
    catch语句的参数类似于方法的声明,包括一个异常类型和一个异常对象名。异常类型必须为Throwable类的子类,它指明了catch语句所处理的异常类型,异常对象则由运行时系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调用对象的方法。
    catch语句可以有多个,分别处理不同类的异常。Java运行时系统从上到下分别对每个catch语句处理的异常类型进行检测,直到找到类型相匹配的catch语句为止。这里,类型匹配指catch所处理的异常类型与生成的异常对象的类型完全一致或者是它的父类(注意,父类也可以啊),因此,catch语句的排列顺序应该是从特殊到一般。也可以用一个catch语句处理多个异常类型,这时它的异常类型参数应该是这多个异常类型的父类,程序设计中要
根据具体的情况来选择catch语句的异常处理类型。
    3、finally语句 
    try所限定的代码中,当抛出一个异常时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛出或不抛出异常,也无论catch语句的异常类型是否与所抛出的异常的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。所以finally语句用来处理由于异常导致的try和catch中资源的浪费问题。
    对于Java的异常机制,我暂时也就只能说出这么多了~谢谢龙哥的指导,也谢谢百度的强大~感谢您肯花功夫看一个初学者的絮絮叨叨,其中会有不对的地方,希望前辈高人能够多多指点。再次感谢~
============分割线=======================
   在(敏感词)再次讲过异常机制之后,对于异常的机制又有了一些了解。
    我们通常所说的异常都是Exception类及其子类的对象。这些异常又分为运行时异常RuntimeException和强制异常两种。在编程时,我们常常需要处理的,也是编译软件提醒我们处理的异常都是强制异常。我们处理这些异常所用到的方法就是try……catch语句和throws关键字,这些在上面都有所介绍。
    而对于运行时异常,比如数组下标越界IndexOutOfBoundsException、空指针异常NullPointerException等等,我们可以不在程序中进行try……catch验证,因为这些错误是由于程序员在编写程序时的逻辑错误或者马虎大意导致的,是可以通过修改程序而避免的问题。这类错误在虚拟机对代码进行编译时会自动抛出错误。当然,我们也可以对某段我们认为可能出错的语句进行try……catch,这时我们需要自定义个Exception类或其子类的对象,作为catch中处理的对象。当然也可以throws,要求调用该方法的方法或者对象验证异常。
    Exception还有一个兄弟类Error。对于这个类中,我们常碰到的是内存溢出OutOfMemoryError和栈溢出StackOverflowError。
    内存溢出通常是创建了过多的对象或者对象的占用的空间超过了虚拟机预设的空间大小。例如:
  int[] data = new int[100000000000000];
或者
   ArrayList<Integer> data = new ArrayList<Integer>();
   while(true){
int temp = 0;
data.add(temp);

   }
都能导致内存溢出的错误。这些情况都是由于我们在编写代码的时候的逻辑问题和粗心大意导致的,只要多加注意就能改过来的。
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics