`
Tonyguxu
  • 浏览: 278708 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Core JAVA】异常

 
阅读更多


  先从 java 异常基础 入手,在学习了这些基本知识后,该思考怎么活学活用,异常使用时的注意点,怎么用好异常这些问题了,可以研究下

Effective Java中异常一章J2EE项目异常处理


异常和错误的区别

在程序的运行过程中,会出现某些特殊情况。其中可以处理的叫做

异常(java.lang.Exception),不能处理的严重问题叫错误(java.lang.Error)



java异常机制

1 当执行到产生异常的代码时,由JVM或程序员抛出异常对象

2 寻找异常处理的代码(try/catch),如果有,处理完毕

3 如果没有找到,继续上抛(抛到上一层),继续寻找

4 如果到main()方法中还没有处理,异常会中断代码的执行

5 每抛出一层,异常会中断当前层的代码


Java异常体系结构

java提供了三种可抛出结构(throwable):检测异常、非检测异常和Error。


 -class Throwable

         -class Error

         -class Exception

                   下面是check异常

                   -IOException

                   -SQLException

                   -TimeoutExcepton

                   -ClassNotFoundException

                   -CloneNotSupportedException

                   -DataFormatException

                   …………………..

                   下面是uncheck异常

          -RuntimeException

          -IllegalStateException



何时使用异常?

异常应该只用于异常的情况下,而不应该用于正常的控制流。

典型例子是遍历数组,怎么处理数组越界问题?怎么在数组不越界下正常操作?Iterator提供了状态测试方法hasNext()及取值方法next(),next是个状态相关方法,对于Iterator的遍历采取的策略是


for(Iterator<Foo> it = collection.iterator(); it.hasNext(); ){
     Foo foo = it.next();
     ...
}

 对于正常的操作流需要避免使用异常,通常有两种做法:

1.针对“状态相关操作” 提供 “状态测试代码”  2.“可识别的返回值”

做法1,就要考虑是否存在并发访问时的线程安全问题(竞争条件),“状态相关操作” 和 “状态测试代码”操作的对象是否是跨线程的共享变量,其状态是否可改变,是否需要在访问该变量的时候使用同步。

做法2要考虑是当对象处于不适当状态中返回的可识别值是否是合法的值,如null、-1等。


检测异常与非检测异常的比较与选择

      Runtime Exception(运行时异常,非检测异常 unchecked exception) --- 这类异常是程序员没有进行必要的检查,由于疏忽和错误而产生的。通常使用if判断处理。属于虚拟机内部的异常。

      非Runtime Exception(编译时异常,检测异常 checked exception)  -- 常常用try/catch处理。


【理解】:首先异常通常分为两类,Runtime Exception和非Runtime Exception,对于Runtime Exception,中文名为非检测异常,就是程序员没有进行相应的检测而产生的异常,比如,除法中除数为0,某个变量为null,数组越界等等。检测的方法就是在操作前通过if( )进行检测。而检测异常是通过try/catch由编译器来进行检测,而Runtime Exception在编译时是不能检测的,只有运行后才能检测到。

另外在程序中,自定义异常类时public Class xxException extends Exception,该异常是检测异常,

Public Class xxException extends RuntimeException,该异常是非检测异常。

【如何选择】

如果期望调用者能够适当地恢复,对于可恢复情况应该使用检测异常。

对于编程错误或者前提违例(API使用者没有遵守API使用的规范),应该使用非检测异常。

即:如果正确地使用API并不能阻止异常条件的产生,并且一旦产生异常,使用API的程序可以立即采取有用动作,这样使用检测异常时合适的,否则使用非检测异常。

在进行API设计时,我们不要忽略了,异常也是个完全意义上的对象,可以在上面定义任意的方法,这些方法主要用于为捕获异常的代码提供额外的信息,特别是关于引发这个异常条件的信息。对于检测异常提供这样的辅助方法尤为重要,调用者可以获得一些有助于恢复的信息。例如:一个电话用户因为没有在账户中存入足够的钱,而使在一个收费电话上呼叫失败,于是抛出一个检测异常。这个异常应该提供一个访问方法,以便允许客户查询所缺的金额。


5种常见的非检测异常RuntimeException

1. java.lang.NullPointerException

2. java.lang.ArithmeticException  算数异常(如0作除数,负数被开方)

3. java.lang.ArrayIndexoutofBoundsException

4. java.lang.NumberFormatException 数字格式异常    

如:“abc” --> int

解决办法是 int的正则判断

String intReg = "^-?[0-9]$";

if(str2.matches(intReg)){

int in2 = Integer.parseInt(str2);

}

5. java.lang.ClassCastException  类型转换异常

如:Object obj = 3;

String str = (String)obj;

解决方法是

Object obj = 3;

If(obj  instanceof  String)

   String str = (String)obj;


6. java.lang.IllegalArgumentException

抛出的异常表明向方法传递了一个不合法或不正确的参数

7. java.lang.IllegalStateException

因为接收对象的状态而使调用非法,例如:如果在某个对象被正确初始化之前,调用者就企图使用这个对象,就会抛出该异常。

在http://www.cs.duke.edu/csed/ap/subset/doc/ap/java/lang/IllegalStateException.html对该异常有这样的说明

In the AP subset, an IllegalStateException might be thrown if a class invariant isn't satisfied(变量不能让人满意). For example it might be appropriate to throw this exception if a class representing a month in a calendar year is constructed with the integer 15 when only integer values in the range 1-12 represent valid months.


注意:确保抛出异常的条件与该异常的文档中描述的条件一致。

 

后续:

1.《Effective java》第61条

 

 

 

 

 

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

相关推荐

    corejava异常和内部类.pdf

    ### Java异常机制详解 #### 一、Java异常概述 Java 的异常处理机制是其重要的组成部分之一,主要用于提高程序的健壮性和容错性。在Java中,异常主要分为两大类:`RuntimeException`(未检查异常)和非`...

    Core Java

    掌握这些基础概念和规则是学习Core Java的起点,随着深入学习,还将涉及异常处理、输入/输出、集合框架、多线程、网络编程等更多内容。对于初学者来说,理解并熟练运用这些知识是成为Java程序员的第一步。

    达内Java培训-CoreJava全程笔记(WORD唐亮版)

    CoreJava DAY15 异常、断言 52 CoreJava DAY16 反射、注释 57 CoreJava DAY17 GUI 64 CoreJava DAY18 awt event 81 CoreJava DAY19-20 多线程 85 CoreJava DAY21-22 IO 95 CoreJava DAY23 网络编程 107

    java\CoreJava笔记\CoreJAVA_day01

    CoreJava是Java的基础,涵盖了Java Standard Edition (J2SE)的主要内容,包括基本语法、面向对象编程(OO)原则、核心类库的使用等。在学习CoreJava时,我们需要掌握以下几个关键知识点: 1. **编程思想**: - ...

    达内 CoreJava老师笔记汇总

    CoreJava DAY15 异常、断言 98 CoreJava DAY16 反射、注释 108 CoreJava DAY17 GUI 120 CoreJava DAY18 awt event 146 CoreJava DAY19-20 多线程 154 CoreJava DAY21-22 IO 174 CoreJava DAY23 网络编程 197

    Core Java( Java 核心) PDF 教材

    《Core Java》是由Sun Microsystems公司出版的一本权威的Java编程教材,它全面深入地介绍了Java语言的核心概念和技术。这本书是Java开发者的重要参考资料,对于初学者和有经验的开发者都具有很高的学习价值。以下是...

    corejava,java核心编程

    【标题】:“Core Java,Java核心编程” 【描述】:“Java语法基础,Java面向对象编程,图形用户界面(GUI)编程,Java网络编程:Socket编程” 【标签】:“corejava” 在计算机编程领域,Core Java是指Java的...

    Core Java.JAVA核心技术(中文版)

    《Core Java.JAVA核心技术(中文版)》是学习Java编程的重要参考资料,主要涵盖了Java语言的基础以及进阶知识。这本书深入浅出地讲解了Java的核心概念和技术,为读者提供了全面而细致的学习路径。以下是对该书内容的...

    corejava(source)

    CoreJava源码中包含了各种异常的处理机制,包括try-catch-finally语句块的使用,自定义异常类的创建,以及如何进行异常的传递和捕获。通过研究源码,我们可以更清晰地了解异常处理的最佳实践。 三、集合框架 Java...

    core java 学习java的书籍

    《Core Java 学习》是一本专为Java初学者和进阶者编写的经典教材,旨在帮助读者深入理解和掌握Java编程的核心概念和技术。书中的内容覆盖了Java语言的基础语法、面向对象编程、异常处理、多线程、集合框架、输入输出...

    Java试题-CoreJava试题

    Java是世界上最流行的编程语言之一...这些知识点覆盖了Java的基础语法、异常处理、多线程、对象和类、布局管理器等方面,对于学习和理解CoreJava至关重要。通过解答这些试题,学生可以巩固和提升对Java核心概念的理解。

    core java1&2

    《Core Java 1&2》是Java编程领域中两本非常经典的教材,分别对应于卷1和卷2,英文版提供了全面且深入的Java学习资源。这两本书由Cay S. Horstmann和Gary Cornell撰写,是许多程序员入门和进阶Java技术的重要参考书...

    系统core和java虚拟机异常退出日志设置

    系统core和java虚拟机异常退出日志设置 系统core和java虚拟机异常退出日志设置是系统管理员和开发者需要了解的重要知识点。系统核心崩溃日志和Java虚拟机崩溃日志都是非常重要的日志文件,它们可以帮助我们 debug ...

    Core Java面试重点知识总结

    【Core Java面试重点知识总结】 在Java开发领域,掌握Core Java的基本概念和技术是至关重要的,尤其是在面试环节。本文将深入探讨Core Java中的JVM架构及其关键组成部分,包括类装载器、执行引擎、运行时数据区域...

    corejava学习笔记

    Java是一种广泛使用的面向对象的编程语言,其基础知识构成了"Core Java"的学习内容。在学习Java时,遵循"多花时间、多动手、多问题"的原则至关重要,因为理论理解与实践操作相结合能更好地掌握知识。 1. **Java语法...

    CoreJava CoreJava

    10. **异常处理**:学习Java的异常处理机制,包括try-catch-finally语句块,异常的抛出和捕获,以及自定义异常。 11. **集合框架**:Java集合框架包括List、Set、Queue和Map接口,以及ArrayList、LinkedList、...

    CoreJava视频课程(百度云链接)

    根据提供的文件信息,我们可以推断出这是一套关于CoreJava的视频教程。下面将围绕CoreJava的核心知识点进行详细的介绍。 ### CoreJava基础知识 #### Java语言简介 Java是一种广泛使用的、面向对象的编程语言,由...

    corejava12示例代码

    《CoreJava12示例代码》是一份针对Java编程语言深度学习的重要资源,主要涵盖了CoreJava12版本中的核心概念和特性。这份压缩包文件包含了丰富的示例代码,旨在帮助开发者深入理解Java语言的各个方面,提升编程技能。...

Global site tag (gtag.js) - Google Analytics