`

关于Exception学习

阅读更多

1. 可以灵活的处理异常,如果当前方法有能力处理异常,就捕获并处理它,否则只需抛出异常,由方法调用者来处理它。
      a) 事实上,异常还有一个非常有用的作用,可以用它来做流程控制。
2. 
在Java编程语言中,用try和catch语句来处理异常。格式如下:<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> </v:shapetype>

<v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype>
 
  try {
    // code that might throw a particular exception
  } catch (SpecialException e) {
    // code to execute if a SpecialException  is thrown
  } catch (Exception e) {
 //code to execute if a general Exception exception is thrown
 }
---------------------------------------------------------------------------------------------------------------
关键字throws 指出方法有可能抛出的异常,如果方法有可能抛出多个异常,可以在throws后添加多个异常,声明抛出多个异常
例如:methodName throws Exception1,Exception2,Exception3

Throwable是所有异常类的父类,继承自Object类。Throwable又分为两种(Error,Exception,均继承自Throwable);
Error :用来表示编译时和系统错误
Exception : 可以抛出的基本类型


注意:
<1>声明异常的关键字是:throws;  抛出异常的关键字是: throw

<2>一个方法只能抛出在方法声明中声明的异常以及异常Error,RuntimeException和它们的子类。例如;如果没有在方法声明中声明IOException异常,那么在这个方法体中就不能抛出它。但是,即使方法没有声明RuntimeException或它的子类,方法也总能抛出它们。此外,java强迫程序员处理异常。如果一个方法声明了Error和RuntimeException之外的异常,则必须在调用它的地方用try语句中进行捕获和处理,以避免程序突然中止。

 <3>如果try块中的某条语句抛出了一个异常,那么java就会略过其余语句,开始为该异常搜索异常处理器。如果异常的类型与某个catch子句所列的异常匹配,就会执行该catch语句子句中的代码,如果异常类型与任何一个catch子句中的异常都不匹配,那么就会跳过try块中的其它语句,执行finally子句,并退出这个方法,将异常传递给调用该方法的方法,继续重复寻找事件处理器的过程。如果在方法调用链中始终没有找到异常处理器,程序就会中止,并在控制台上打印出错误信息。

 <4>如果在图形程序中出现了Exception子类的一个异常,java在控制台上打印错误,但程序回到处理用户界面的循环继续运行,忽略该异常。

 <5>如果一个catch子句捕获了一个父类的异常,它就能捕获那个父类所有子类的异常对象。

 <6>catch子句中指定异常的顺序非常重要。如果在父类的异常对象前没有指定这个异常对象,就会导致编译错误。
 <7>通常情况下,异常处理需要更多的时间和资源。如果可能的话应该用判断语句测试简单的异常。而用异常去处理那些if语句不能解决的问题。

3.finally语句定义一个总是被执行的代码块,而不管有没有出现异常
-----------------------------
public void work() {
  try{
   开门
   工作8个小时  //可能会抛出DiseaseException异常
  }catch(DiseaseException e){
    去医院看病;
  }finally{
    关门
  }
}
finally语句不被执行的唯一情况是程序先执行了终止程序的System.exit()方法
注意:即使在函数中使用return()语句也不能禁止执行return()语句块
public static void main(String args[]){
  try{
System.out.println("Begin");
return();   //在跳出本函数之前,仍然先执行finally语句块
    System.exit(0);
  }finally{
    System.out.println("Finally");
  }
  System.out.println("End");
}

4.
异常处理流程
try{
  code1;  //可能抛出各种异常
}catch(SQLException e){
  System.out.println("SQLException");
}catch(IOException e){
  System.out.println("IOException");
}catch(Exception e){  //通常将异常继承关系中顶层异常放在最后
  System.out.println("Exception");
}

5.
运行时异常 (不受检查异常)
java并未要求在方法中显示的声明运行时异常,这些异常异常会自动被JVM抛出
RuntimeException类及其子类都称为运行时异常,这种异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过,只会在运行时才报错。例如当以下divide()方法的参数b为0,执行“a/b”操作时会出现ArrithmeticException异常,它属于运行时异常,Java编译器不会检查它:
原因 :RuntimeException代表的是编程异常,这些错误是无法预料。所以不可能交给编译器在编译时做检查
public int divide(int a,int b){
  return a/b;  //当参数b为0,抛出ArrithmeticException
}

区分运行时异常和受检查异常
运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误操作。一旦出现了错误操作,建议终止程序(会抛出异常并终止程序),因此Java编译器不检查这种异常。


public void method(int[] array){
  for(int i=0;i<=array.length;i++)
    array[i]=1;  //当i的取值为array.length时,将抛出ArrayIndexOutOfBoundsException
}

-------
修改为
public void method(int[] array){
  for(int i=0;i     array[i]=1;  //不会抛出ArrayIndexOutOfBoundsException
}
-------------
受检查异常
表示程序可以处理的异常,如果抛出异常的方法本身不能处理它,那么方法调用者应该去处理它,从而使程序恢复运行,不至于终止程序。
如果一个方法可能出现受检查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出(当然也可以声明抛出它的父类异常),那么就需要在使用该方法的地方捕获异常或再一次将他抛出,否则在编译时就会导致编译错误。

void method1() throws IOException{}  //合法

//编译错误,必须捕获或声明抛出IOException
void method2(){
  method1(); 
}

//合法,声明抛出IOException
void method3()throws IOException {
  method1(); 
}
------------------
//合法,声明抛出Exception
void method4() throws Exception {
  method1(); 
}

//合法,捕获IOException
void method5(){
 try{
    method1(); 
 }catch(IOException e){…}
}
------------------------
用户定义异常
用户定义异常是通过扩展Exception类或RuntimeException来创建的
class AnswerWrongException extends Exception {
    private int result;
    public AnswerWrongException (int result){
      this.result=result;
    }
    public int getResult() {
      return result;
    }
 }
----------------
public class ExceptionTester{
  public static void test(int x,int y,int z)throws AnswerWrongException{
    if(x+y!=z) throw new AnswerWrongException(z);
    System.out.println(x+"+"+y+"="+z);
  }
  public static void main(String args[]) {
    try{
      test(1,2,5);
      System.out.println("end");
    }catch( AnswerWrongException e){
       System.out.println("result is wrong:"+e.getResult());
       e.printStackTrace();
    }
  }
}
------------------

案例分析:
public class Compute {
 /**
  * 方法本身处理异常,调用者就不能再处理
  */
 public int work(int a,int b){
  int result = 0;
  try{
   result = a/b;
  }catch(Exception e){
   e.printStackTrace();
  }
  return result;
 }
 /**
  * 方法本身不做统一的异常处理
  * 由调用者自己进行处理,能满足
  * 调用者想进行不同处理的情况
  */
 public int work1(int a,int b) throws Exception{
  int result = 0;
  result = a/b;
  return result;
 }
 /**
  * 方法本身进行异常的处理
  * 同时调用者也进行各自的处理
  * 需要在方法的catch里处理完后,再
  * throw该异常对象
  */
 public int work2(int a,int b) throws Exception{
  int result = 0;
  try{
   result = a/b;
  }catch(Exception e){
   e.printStackTrace();
   System.out.println("in work2");
   throw e;    //将这个异常抛给方法的调用者再进行处理
  }
  return result;
 }
 /**
  * 使用返回值让调用者判断区分处理
  */
 public int work3(){
  ///
  //
  int a = 12;
  if(a==12){
   return 1;
  }
  System.out.println("in work3");
  return 2;
 }
 /**
  * 使用抛出异常对象来达到让调用者区分
  * 处理的目的
  */
 public void work4() throws Exception{
  int a = 12;
  if(a==12){
   throw new Exception();     //
  }
  System.out.println("in work4");
 }
 
 public void work5() throws RuntimeException{
  int b = 12;
  if(b==12){
   throw new RuntimeException();     //可以起到流程控制的作用
  }
  System.out.println("in work5");
 }
}
/**
 * throws throw
 * 1:使用的位置  throws  放在方法参数的后边
 *              throw 放在方法里面
 * 2:从后面跟的内容   throws   异常的类名
 *                  throw    异常类的对象
 * 3:从功能   throws 表示该方法不处理异常,方法
 *                  产生的异常一定由调用者处理
 *           throw  主动抛出一个异常类的对象
 */

 

 
  • 大小: 28.9 KB
分享到:
评论

相关推荐

    exception C++ & More exception C++

    "Exception C++ & More Exception C++"可能是指两本关于深入理解和应用C++异常处理机制的书籍,其中包含"More Exceptional C++.chm"和"Exceptional C++.chm"这两个章节或部分。 异常处理是C++中的一个核心特性,它...

    Android Native Exception

    通过对这些知识点的学习,开发者可以更好地理解Android系统的底层机制,并有效定位和解决实际开发过程中遇到的问题。此外,掌握Native Exception的处理流程也是提高应用稳定性和性能的重要手段之一。

    java Exception

    ### Java中的异常处理详解 #### 一、异常基础概述 ...通过以上内容的学习,我们可以更好地理解Java中的异常处理机制,并能够在实际编程中合理运用各种异常处理技术,提升程序的健壮性和用户体验。

    Uncaught DOMException:

    综上所述,“Uncaught DOMException:”错误是JavaScript编程中常见的一个问题,通过理解DOM工作原理、检查代码、使用开发者工具和学习最佳实践,我们可以有效地诊断和修复这类问题。对于那些经常进行前端开发的人员...

    error与Exception的区别

    在编程世界中,错误处理是不可或缺的一部分,Java和许多其他编程语言中,"error"和"exception"这两个术语经常被提及。理解它们之间的区别对于编写健壮和可靠的代码至关重要。 首先,我们来看"error"。在Java中,`...

    JAVA 自定义异常 Exception

    在Java编程语言中,异常处理是一项关键特性,用于处理程序运行时可能出现的错误或异常情况。...通过学习和掌握这一技能,开发者可以在面对复杂问题时,更好地控制和解决程序异常,确保代码的正常运行。

    C++Exception 异常处理 源码

    在C++编程中,异常处理是一项关键的错误处理机制,它允许程序员在程序运行时捕获和处理意外的情况。...提供的源码应该包含了如何在实际程序中使用这些概念的例子,是学习和理解C++异常处理的好资源。

    exception stdexcept streambuf 头文件

    在深入学习`streambuf`和`stdexcept`时,你需要理解: - `std::streambuf`的子类如`std::ifstreambuf`和`std::ostreambuf`,它们分别用于文件输入和输出。 - 如何自定义`std::streambuf`子类以处理特定的数据源或...

    一个关于Exception的基础题

    在编程领域,异常(Exception)是程序运行时出现的错误情况,它中断了正常的执行流程。这个基础题可能涉及到如何理解和处理Java中的异常...在实际工作中,我们需要不断地学习和实践,以应对各种复杂情况下的异常处理。

    Exception C++ 和 More Exception C++

    在C++编程语言中,异常处理是一个至关重要的概念,它允许程序员优雅地处理程序运行时可能出现的...通过深入学习“Exception C++ 和 More Exception C++”,你将能够更好地理解和应用这些概念,提高你的C++编程能力。

    more exception C++讲述C++知识点

    在C++编程中,异常处理是一项至关重要的技能,尤其是在面试中,熟练掌握异常处理机制能够展示出对程序健壮...通过学习和理解这些内容,你将能够在面试中自信地讨论和应用异常处理,从而提升你的编程技能和职业竞争力。

    log4j日志记录对于exception的记录问题

    "log4j的使用.xls"可能是提供了一个关于如何配置和使用Log4j的教程或者示例。在Excel表格中,它可能包含了详细的步骤、配置参数解释,以及示例代码,帮助开发者理解如何设置Log4j以记录异常信息。例如,它可能会指导...

    Exception

    在压缩包中包含的文件"马士兵_J2SE第四章__Java_异常处理个人学习笔记.doc"很可能是一个详细的文档,总结了学习Java标准版(J2SE)第四章关于异常处理的内容。这份笔记可能涵盖了以下关键知识点: 1. **异常类的...

    VC++exception handling

    通过学习和实践VC++的异常处理,开发者能够编写出更健壮、更易于维护的代码,能够优雅地处理不可预见的运行时问题,提高程序的稳定性和可靠性。了解并熟练运用这些概念,对于提升编程技能和解决实际问题具有重要意义...

    exception 需要解决的问题

    在IT行业中,异常处理是程序开发中不可或缺的一部分。异常(Exception)是程序运行时出现的错误情况,它中断了...通过不断学习和实践,我们可以更好地应对"exception 需要解决的问题",编写出更加健壮和可靠的软件。

    Hijacking Linux Page Fault Handler Exception Table中文版

    ### Hijacking Linux Page Fault Handler Exception Table中文版 #### 1. 引言 本文将详细介绍如何利用Linux内核中的一个特殊机制——页面...希望读者能够从中学习到有用的知识,并在实际工作中采取相应的安全措施。

    异常示例(Exception)

    在编程领域,异常处理是确保程序健壮性的重要一环,尤其是在Java这样的强类型语言中。...通过对给定的示例文件进行学习,我们可以更深入地了解如何在实际开发中应用这些原则,从而编写出更健壮的Java应用程序。

    more_exception_cpp

    McMillan撰写的一本关于C++异常处理的深入书籍,由Addison-Wesley出版。这本书是为那些已经熟悉C++基础,希望进一步提升对异常处理机制理解的程序员准备的。通过阅读本书,读者能够掌握如何在C++编程中更有效地利用...

Global site tag (gtag.js) - Google Analytics