java异常机制

合集下载

C 或Java中的异常处理机制的简单原理和应用

C  或Java中的异常处理机制的简单原理和应用
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overridi
ng)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被
“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同 的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违
反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发In
dexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉Inte
rruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤
醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
13,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以im
plements(实现)interface(接口)?
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以
作为一个接口,由另一个内部类实现。
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
20,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

Java异常面试题 33道

Java异常面试题 33道

Java异常架构与异常关键字1. Java异常简介Java异常是Java提供的一种识别及响应错误的一致性机制。

Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。

在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。

2. Java异常架构1. ThrowableThrowable 是 Java 语言中所有错误与异常的超类。

Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。

Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。

2. Error(错误)定义:Error 类及其子类。

程序中无法处理的错误,表示运行应用程序中出现了严重的错误。

特点:此类错误一般表示代码运行时 JVM 出现问题。

通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。

比如 OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出错误。

此类错误发生时,JVM 将终止线程。

这些错误是不受检异常,非代码性错误。

因此,当此类错误发生时,应用程序不应该去处理此类错误。

按照Java惯例,我们是不应该实现任何新的Error子类的!3. Exception(异常)程序本身可以捕获并且可以处理的异常。

Exception 这种异常又分为两类:运行时异常和编译时异常。

运行时异常定义:RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。

特点:Java 编译器不会检查它。

也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。

java异常处理机制

java异常处理机制

java异常处理机制
Java的异常处理是结构化编程的一个重要方面。

它提供了一种通用的方式来处理发生在应用程序或系统中的异常,比在代码中添加报错信息更有效。

Java异常处理模型包括异常类,异常处理器,throw和throws关键字以及堆栈跟踪。

异常类是Java的一种特殊类,它表示程序的异常状态(或者是错误情况)。

它从Java的Throwable类继承,Throwable类有两个子类,Exception和Error,它们派生出一组定义在Java中的异常。

异常处理器允许处理一个或多个特定类型的异常,是程序中处理异常的机制。

异常处理器通常作为程序的一部分,程序员可以通过编写异常处理器来为应用程序创建一个可以处理未知错误的安全环境。

Throw和throws关键字用于抛出异常。

Throw关键字用于将异常抛出到当前函数的调用点,throws关键字用于声明哪些异常可以被抛出,以便该方法的调用者可以捕获和处理它们。

堆栈跟踪是一种异常处理工具,可以展示异常期间应用程序运行的具体位置,同时可以追踪嵌套方法调用,并可以提供出现异常时的参数值,类型等等。

Java的异常处理机制为程序员提供了一种有效的处理在程序的运行过程中可能会发生的系统或应用程序异常的方法。

它可以保护应用程序免受非正常状况的危害,提高程序的安全性和效率。

Java常见异常(RuntimeException)详细介绍并总结

Java常见异常(RuntimeException)详细介绍并总结

Java常见异常(RuntimeException)详细介绍并总结本⽂重在Java中异常机制的⼀些概念。

写本⽂的⽬的在于⽅便我很长时间后若是忘了这些东西可以通过这篇⽂章迅速回忆起来。

1. 异常机制1.1 异常机制是指当程序出现错误后,程序如何处理。

具体来说,异常机制提供了程序退出的安全通道。

当出现错误后,程序执⾏的流程发⽣改变,程序的控制权转移到异常处理器。

1.2 传统的处理异常的办法是,函数返回⼀个特殊的结果来表⽰出现异常(通常这个特殊结果是⼤家约定俗称的),调⽤该函数的程序负责检查并分析函数返回的结果。

这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确的值时就会出现混淆;可读性降低,将程序代码与处理异常的代码混爹在⼀起;由调⽤函数的程序来分析错误,这就要求客户程序员对库函数有很深的了解。

1.3 异常处理的流程1.3.1 遇到错误,⽅法⽴即结束,并不返回⼀个值;同时,抛出⼀个异常对象1.3.2 调⽤该⽅法的程序也不会继续执⾏下去,⽽是搜索⼀个可以处理该异常的异常处理器,并执⾏其中的代码2 异常的分类2.1 异常的分类2.1.1 异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。

2.1.2 Error和RuntimeException及其⼦类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。

2.2 每个类型的异常的特点2.2.1 Error体系 Error类体系描述了Java运⾏系统中的内部错误以及资源耗尽的情形。

应⽤程序不应该抛出这种类型的对象(⼀般是由虚拟机抛出)。

如果出现这种错误,除了尽⼒使程序安全退出外,在其他⽅⾯是⽆能为⼒的。

java异常处理三原则-概述说明以及解释

java异常处理三原则-概述说明以及解释

java异常处理三原则-概述说明以及解释1.引言1.1 概述在软件开发过程中,异常处理是一个至关重要的话题。

在编写Java程序时,我们经常会遇到各种异常情况,如空指针异常、数组越界异常等。

良好的异常处理能够帮助我们更好地定位和解决问题,提高程序的稳定性和可维护性。

本文将介绍Java异常处理的三个原则,分别是捕获精准异常、处理异常逻辑清晰、抛出异常合理化。

通过遵循这三个原则,我们可以更好地处理异常情况,提高代码的健壮性和可读性。

在接下来的章节中,我们将详细解释每个原则的含义和实践方法,并探讨异常处理在软件开发中的重要性和未来发展趋势。

希望本文能够帮助读者更好地理解和运用Java异常处理的技巧,提升自身的编程水平。

1.2 文章结构本文将按照以下结构展开讨论java异常处理的三原则。

首先,我们将在引言部分概述异常处理的重要性和必要性。

随后,我们将详细介绍三条异常处理原则,即捕获精准异常、处理异常逻辑清晰、抛出异常合理化。

每一条原则都将以具体例子和代码来说明其重要性和实际应用。

最后,在结论部分将总结三个原则的重要性,并探讨未来异常处理的发展趋势和应用前景。

整篇文章将帮助读者更好地理解和应用java异常处理的三原则。

1.3 目的:在编写Java程序时,异常处理是非常重要的一部分。

异常处理可以帮助我们及时发现程序运行中的问题,并且通过合理的处理方式保证程序的稳定性和可靠性。

本文的主要目的是介绍Java异常处理的三大原则,帮助读者了解如何正确地处理异常,提高程序的质量和可维护性。

通过学习和遵循这三大原则,可以使我们的代码更加健壮,减少程序出错的可能性,提高代码的可读性和可维护性。

希望读者能够通过本文的学习,掌握Java 异常处理的核心概念,为自己的编程技能提升一个新的高度。

2.正文2.1 第一原则- 捕获精准异常在Java异常处理中,第一原则是捕获精准异常。

这意味着在代码中应该尽可能精确地捕获并处理异常,而不是简单地捕获所有异常或者把所有异常都抛出去。

浅析Java异常处理机制及应用

浅析Java异常处理机制及应用

浅析Java异常处理机制及应用摘要:Java异常处理机制是Java编程语言中最为重要的机制之一,它可以在代码中处理各种类型的异常。

本文将对Java异常处理机制进行浅析,并从应用层面探讨一些常见的Java异常处理方法。

关键词:Java,异常处理,应用正文:一、Java异常处理机制Java异常处理机制是Java编程语言中最为重要的机制之一。

在Java语言中,异常是指一个程序运行时产生的意外情况,可以是代码中的错误,也可以是由于外部环境因素导致的错误。

Java提供了一整套异常处理机制,可以帮助开发者处理各种类型的异常。

在Java中,异常通常被定义为继承自Throwable类的任意一个子类。

常见的异常类型包括RuntimeException、IOException、ClassNotFoundException、ArithmeticException等等。

Java中异常的处理主要分为两种方式:try-catch块和throws语句。

try-catch块是一种捕捉异常的方法,其基本语法结构如下:```try {// 可能会抛出异常的代码块} catch (type1 e1) {// 处理type1类型异常的代码块} catch (type2 e2) {// 处理type2类型异常的代码块} finally {// 不管是否发生异常,都会执行的代码块}```throws语句是一种抛出异常的方法,其基本语法结构如下:```public void methodName() throws ExceptionType {// 可能会抛出异常的代码块}```二、Java异常处理的应用Java异常处理机制应用广泛,以下是应用层面探讨一些常见的Java异常处理方法。

1、基于try-catch块的异常处理try-catch块是Java中最基本的异常处理方法。

它可以在程序运行时捕捉异常,并且根据不同的异常类型采取不同的处理方法。

简述java中异常处理机制的流程。

简述java中异常处理机制的流程。

Java是一种面向对象的编程语言,所以在编写Java程序时需要考虑异常处理。

异常是指在程序运行过程中出现的错误、故障或意外情况,而异常处理机制则是为了保证程序在遇到异常时能够正确、有效地进行处理,确保程序的稳定性和安全性。

1. 异常的分类在Java中,异常分为受检异常(Checked Exception)和非受检异常(Unchecked Exception)。

受检异常是指在编译期就能够被检测到的异常,需要进行显式的处理;非受检异常则是指在运行期才能被检测到的异常,通常是由程序错误造成的,需要进行相应的处理。

2. 异常处理机制的流程在Java中,异常处理机制主要涉及到try、catch、finally和throw关键字的使用。

(1) try块:在try块中编写可能会引发异常的代码。

如果在try块中出现了异常,程序会立即跳转到catch块进行相应的异常处理。

(2) catch块:在catch块中定义对异常的处理逻辑。

在catch块中可以针对不同类型的异常编写不同的处理代码,也可以进行异常的记录、打印或其他操作。

(3) finally块:finally块中的代码无论是否出现异常都会被执行。

通常在finally块中释放资源、关闭文件等清理工作。

(4) throw关键字:throw关键字用于手动抛出一个异常。

当程序中的某个条件不满足时,可以使用throw关键字抛出一个异常,然后交由catch块进行处理。

3. 异常处理机制的应用在实际的Java编程中,异常处理机制是非常重要的。

通过合理地编写异常处理代码,可以提高程序的容错性和稳定性,保证程序在面对异常时能够优雅地处理并继续执行。

另外,Java中还提供了一些与异常相关的类,例如Throwable、Exception和RuntimeException等,开发人员可以根据实际需求选择合适的异常类来进行处理。

异常处理机制是Java程序设计中不可或缺的重要部分,合理并且规范地使用异常处理机制能够提高程序的可靠性和稳定性,也能让程序更加健壮。

JAVA异常处理机制

JAVA异常处理机制

JAVA异常处理机制摘要:在编写java程序时,应尽可能避免异常的发生;在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而中断或产生不可预见的结果。

该文阐述如何运用java的异常处理机制为我们控制和处理异常的出现,从而保证程序的安全性和可用性。

关键词: java;异常;异常处理;继承中图分类号:tp311 文献标识码:a 文章编号:1009-3044(2013)15-3525-02异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。

例如:整数除以零、使用空指针、数组越界访问、文件找不到、用户输入错误、格式不正确的url、连接数据库失败等等。

异常不同于编译错误,编译错误是因为程序存在语法问题而未通过编译,异常其实相当于运行错误,也就是在程序的运行中出现一些没有预料到的情况或不能人为控制的因素,这时就需要进行异常处理。

1 异常的处理机制异常产生的位置是在方法内部。

我们只会说,一个方法产生了异常,而不是一个类或一个变量产生了异常。

java程序在执行过程中如果某个方法内出现异常,会自动生成一个异常类的对象(throwable),该异常对象将被自动提交给jvm,这个过程称之为抛出(throw)异常[1]。

异常抛出之后,jvm会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称之为捕获(catch)异常和处理异常。

如果jvm找不到可以捕获异常的代码,jvm会终止当前程序的运行,并打印异常堆栈信息。

2 异常的分类以及继承关系在java中,异常情况分为两在类:exception(异常)类和error (错误)类[2]。

1)错误(error):jvm系统内部错误或资源耗尽等严重情况属于jvm需要负担的责任。

2)异常(exception):其它因编程错误或偶然的外在因素导致的一般性问题。

这类异常得到恰当的处理时,程序有机会恢复至正常运行状况。

从编程角度也可以把throwable分为两个分支:1)不受检查(unchecked)异常,包括runtimeexcepton及其子类和error:编译器不要求强制处理的异常。

java异常处理

java异常处理
6
Try与 Try与catch
try
捕获违例的第一步是用try{… 捕获违例的第一步是用 try{…} 语句块选定捕 获违例的范围。 获违例的范围。 catch 在catch语句块中是对违例对象进行处理 catch语句块中是对违例对象进行处理 的代码
每个try 语句块可以伴随一个或多个catch 语句, 每个 try语句块可以伴随一个或多个 catch语句 , 用 于处理可能产生的不同类型的违例对象。 于处理可能产生的不同类型的违例对象 。 与其它 对象一样, 对象一样 , 可以访问一个违例对象的成员变量或 调用它的方法。 调用它的方法。 getMessage( ) 方法,用来得到有关异常事件的信 方法, 息 printStackTrace( )用来跟踪异常事件发生时执行 堆栈的内容。 堆栈的内容。
IOExeption
从一个不存在的文件中读取数据 越过文件结尾继续读取 连接一个不存在的URL 连接一个不存在的URL
5
Java当中的异常处理机制 Java当中的异常处理机制
异常是一个对象,必须是某个异常类的实 例,这个异常必须是已经定义好的。 例,这个异常必须是已经定义好的。 Java类库中已经存在了许多异常类,每种异 Java类库中已经存在了许多异常类,每种异 常类对应着某一种或者某一类错误,类中 包含着错误的相关信息和处理方法。 如果程序发生错误的当前结构中没有处理 如果程序发生错误的当前结构中没有处理 此异常的机制,那么它将移交给外层结构 处理,如果还不行,就继续上交,直到操 处理,如果还不行,就继续上交,直到操 作系统,操作系统就会终止程序的运行。
17
异常使用中的两个问题(1) 异常使用中的两个问题(
异常的匹配:异常的控制过程与swich相似, 异常的匹配:异常的控制过程与swich相似, 但有本质区别

Java里的异常(Exception)详解

Java里的异常(Exception)详解

Java⾥的异常(Exception)详解作为⼀位初学者, 本屌也没有能⼒对异常谈得很深⼊. 只不过⾥关于Exception的东西实在是很多. 所以这篇⽂章很长就是了..⼀, 什么是java⾥的异常由于java是c\c++ 发展⽽来的, ⾸先我们先看看c语⾔⾥的错误.1.1 c语⾔⾥的错误我们实现1个程序的过程包括, 代码编写, 编译代码成为程序, 执⾏程序..其中⼤部分常见的语法错误都会被编译代码这样部过滤掉. 但是即使通过了编译. 执⾏程序这⼀步可能还是会有错误.原因很多, 例如常见的除数为0, 内存溢出(数组的index超出界限), 或者内存被其他程序修改等.最简单的例⼦:[java]1. #include <stdio.h>2.3. int f(int a, int b){4. return a/b;5. }6.7. int main(){8. int i = f(8,0);9. printf("i is %d\n",i);10. return 0;11. }上⾯的例⼦编译时是⽆错的, 但是⼀旦执⾏就会提⽰吐核错误了.c语⾔⾥对这种执⾏时出现的错误是⽆能为⼒的, ⼀旦出错就会整个程序崩溃, 就不会在继续执⾏下⾯的代码.⽽且很多时候出错信息很少, 让你⽆法判断出错的原因和地⽅, 只能⼀步步⼩⼼debug...所以很多⽤c写的程序有时会出现⾮法关闭的现象.解决⽅法只能是在代码⾥对可能出错的地⽅添加if 判断.例如f()函数⾥可以对b进⾏判断, 如果是0就不执⾏.1.2 java⾥运⾏时出现的错误java⾥编译器对代码的规范性⽐c严格得多. 但是即使如此, 通过编译的java程序有时也很难避免执⾏时出错.例如, 将上⾯的c程序改编成java程序:[java]1. package Exception_kng;2.3. class Exp1{4. public int f(int a, int b){5. return a/b;6. }7. }8.9. public class Expt_1{10. public static void g(){11. Exp1 e = new Exp1();12. int i = e.f(8,0);13. System.out.printf("i is %d\n", i);14. }15. }运⾏时⼀样会出错, 下⾯是出错信息:[java]1. [java] Caused by: ng.ArithmeticException: / by zero2. [java] at Exception_kng.Exp1.f(Expt_1.java:5)3. [java] at Exception_kng.Expt_1.g(Expt_1.java:12)4. [java] at Enter_1.main(Enter_1.java:31)但是可以见到, java告诉你出错的类型: 运算错误(ArithmeticExcetion), 出错信息和出错的类与⽂件⾏数输出, ⽅便你调试. jvm虚拟机是会对错误作出⼀定的处理的.所以可以简单地将java⾥的异常理解成java运⾏时出现的错误, 异常机制就是对这种错误进⾏处理的机制.1.3 java异常的定义实际上, 当java程序执⾏时出现错误时, jvm会把执⾏时出错的信息(例如出错原因, 类型, 位置) 收集,然后打包成为1个对象(object), 程序员可以对这种对象进⾏处理. 这种对象就是所谓的异常.可能出现的异常的代码并不是肯定会出现异常, 取决于执⾏环境和数据.!⼆, java⾥的异常的分类.见下图:Throwable/ \Error Exception/ / \xxxxxx xxxxxx RuntimeException/ \xxxxxx ArithmeticException上图的所有对象都是类.Throwable 代表是可抛出的.Error 代表的是严重错误, 这种错误程序员⽆法进⾏处理, 例如操作系统崩溃, jvm出错, 动态链接库失败等. Error并不是异常, 不是本⽂的重点.Exception 代表的就是异常了. 它下⾯很多派⽣类, 其中它的派⽣类也分两种, ⼀种是RuntimeException(运⾏时异常), 其他的都是⾮运⾏时异常RuntimeException 包括除数为0, 数组下标超界等. 运⾏时异常的派⽣类有很多, 其产⽣频率较⾼. 它的派⽣类可以由程序处理或者抛给(throw) 给jvm处理. 例如上⾯的例⼦就是抛给了jvm处理, jvm把程序中断执⾏, 并把错误信息输出到终端上.⾮RuntimeExcption 这种异常属于Excepion的派⽣类(上⾯红⾊的xxx), 但是不是RuntimeException的派⽣类, 这种异常必须由程序员⼿动处理,否则不通过编译.ArithmeticExcpetion 算术异常, 它是RuntimeException的派⽣类, 所以程序员不⼿动处理也通过编译, 只不过出错时会被jvm处理.三, java⾥对异常的处理java⾥对异常的处理有三种.3.1 程序猿对有可能出现的异常使⽤try catch处理.例如我们将上⾯的例⼦改动⼀下:[java]1. package Exception_kng;2.3. class Exp2{4. public int f(int a, int b){5. int i = 0;6. try{7. i = a/b;8. }9. catch(Exception e){10. System.out.printf("Exception occurs!!\n");11. System.out.println(e.getMessage()); //print the root cause12. System.out.printf("===========================\n");13. e.printStackTrace(); //print the info of function stuck.14. }15.16. return i;17. }18. }19.20. public class Expt_2{21. public static void g(){22. Exp2 ex = new Exp2();23. int i = ex.f(8,0); //call f()24. System.out.printf("i is %d\n", i); //successfully executed25. }26. }在f()函数中对可能出现的异常的代码进⾏try catch处理后, 程序会执⾏catch⾥的代码. ⽽且不会中断整个程序, 继续执⾏try catch后⾯的代码.程序执⾏输出:[java]1. [java] Exception occurs!!2. [java] / by zero3. [java] ===========================4. [java] ng.ArithmeticException: / by zero5. [java] at Exception_kng.Exp2.f(Expt_2.java:7)6. [java] at Exception_kng.Expt_2.g(Expt_2.java:23)7. [java] at Enter_1.main(Enter_1.java:31)8. [java] i is 0注意最终也执⾏了g()函数中的最后⼀条语句, 输出了i的值.也就是说try catch处理后并不会终⽌程序, 令程序即使出现了错误, 也可以对错误进⾏⼀定的处理后继续执⾏. 这就是java异常机制⽐c语⾔安全的地⽅.下⾯会详细讲解 try catch.注:getMessage() ⽅法: Exception类的⽅法之⼀, 返回异常的原因, 上⾯的 / by zero 就是这个⽅法输出的.printStackTrace(): Exception类的⽅法之⼀, 在屏幕输出函数栈信息, 也就是异常出现的地⽅.3.2 函数⾥并不处理异常, 使⽤throw or throws 关键字把可能出现的异常抛给调⽤该函数的上级函数处理.例如我在f()函数中不想处理可能出现的异常, 想把它抛出上级函数处理:下⾯是个例⼦:[java]1. package Exception_kng;2.3. class Exp3{4. public int f(int a, int b){5. if (0 == b){6. throw new ArithmeticException("Shit !!! / by zero!");7.8. }9.10. return a/b;11. }12. }13.14. public class Expt_3{15. public static void g() throws ArithmeticException{16. Exp3 ex = new Exp3();17. int i = 22;18. i = ex.f(8,0); //throw excetpion19. System.out.printf("i is %d\n", i); //failed executed20. System.out.printf("g() is done!!\n"); //failed executed21. }22.23. public static void h(){24. try{25. g();26. }catch(ArithmeticException e){27. System.out.printf("Exception occurs!!\n");28. System.out.println(e.getMessage()); //print the root cause29. System.out.printf("===========================\n");30. e.printStackTrace(); //print the info of function stuck.31. }32.33. System.out.printf("h() is done!!\n"); //successfully executed34. }35. }可以见到f() 加了个条件判断, 如果参数b = 0, 使⽤throw 直接⼿动抛出1个异常. 让调⽤它的函数处理.g()调⽤f()函数, 预见到f()可能有异常, 但是也不想处理, 使⽤throws 关键字告诉调⽤它的函数本函数有可能抛出这种异常. // 注, 这⾥的throws 对程序并没有实质的影响.h()调⽤g(), 简单g()定义的throws, ⽤try catch在本函数进⾏处理.输出:[java]1. [java] Exception occurs!!2. [java] Shit !!! / by zero!3. [java] ===========================4. [java] ng.ArithmeticException: Shit !!! / by zero!5. [java] at Exception_kng.Exp3.f(Expt_3.java:6)6. [java] at Exception_kng.Expt_3.g(Expt_3.java:18)7. [java] at Exception_kng.Expt_3.h(Expt_3.java:25)8. [java] at Enter_1.main(Enter_1.java:31)9. [java] h() is done!!注意这个程序没有执⾏g() 最后的代码.throw 和 throws 后⾯也会详细讲解.3.3 交给jvm虚拟机处理假如上⾯的例⼦h() 也不处理怎么办? 就如1.2 的例⼦, 会抛给jvm处理.但是这种情况只适⽤于RuntimeExecption及其派⽣类.jvm怎么处理呢, 就是中断整个程序, 并把异常信息输出到屏幕上.实际上, 当java程序的1个函数抛出异常时,⾸先会检查当前函数有没有try catch处理, 如果⽆检查上⼀级函数有⽆try..catch处理....这样在函数栈⾥⼀级⼀级向上检查, 如果直⾄main函数都⽆try..catch, 则抛给jvm..项⽬中强烈建议尽量⼿动处理, 不要把异常交给jvm.四,Try catch finally 的处理机制.这⾥开始详解try catch finally了.语法是这样的.try{可能出异常的若⼲⾏代码;}catch(ExceptionName1 e){产⽣ExceptionName 1的处理代码;}catch(ExceptionName2 e){产⽣ExceptionName 2的处理代码;}...finally{⽆论如何, 最终肯定会执⾏的代码}4.1 try catch finally的执⾏路线.下⾯⽤个例⼦来说明:[java]1. try{2. f();3. ff();4. }5. catch(ArithmeticException e){6. g();7. }8. catch(IOException e){9. gg();10. }11. catch(AuthorizedException e){12. ggg();13. }14. finally{15. h();16. }17.18. k();4.1.1 当try⾥⾯的f()抛出了IOException当f()抛出了异常, 那么ff()就不会执⾏了. 程序会尝试捕捉异常.⾸先捕捉ArithmeticException, 捕捉失败.接下来捕捉IOException, 捕捉成功, 执⾏gg();⼀旦捕捉到⼀个异常, 不会再尝试捕捉其他异常, 直接执⾏finally⾥的h();执⾏后⾯的函数k().也就是说路线是:f() -> gg() -> h() -> k()有2点要注意的.1. f()函数极有可能未完整执⾏, 因为它抛出了异常, 抛出异常的语句执⾏失败, 之后的语句放弃执⾏.2. try{} ⾥⾯, f()之后的语句, 例如ff()放弃执⾏.4.1.2 没有任何异常抛出这种情况很简单, 就是try{}⾥⾯的代码被完整执⾏, 因为没有抛出任何异常, 就不会尝试执⾏catch⾥的部分, 直接到finally部分了.路线是:f() -> ff() -> h() -> k()4.2 如何确定要捕捉的异常名字.也许有⼈会问, 我们怎么知道到底会抛出什么异常?下⾯有3个解决⽅案.1.看代码凭经验, 例如看到1段除法的代码, 则有可能抛出算术异常.2.在catch的括号⾥写上Exception e, 毕竟Exception 是所有其他异常的超类, 这⾥涉及多态的知识, ⾄于什么是多态可以看看本⼈的另⼀篇⽂章.3. 观察被调⽤函数的函数定义, 如果有throws后缀, 则可以尝试捕捉throws 后缀抛出的异常4.3 为什么需要finally包括我在内很多⼈会觉得finally语句简直多勾余, 既然是否捕捉到异常都会执⾏, 上⾯那个例⼦⾥的h()为什么不跟下⾯的k() 写在⼀起呢.上⾯的例⼦的确看不出区别.但下⾯两种情况下就体现了finally独特的重要性.4.3.1 抛出了1个异常, 但是没有被任何catch⼦句捕捉成功.例如try⾥⾯抛出了1个A异常, 但是只有后⾯只有捕捉B异常, 和C异常的⼦句.这种情况下, 程序直接执⾏finally{}⾥的⼦句, 然后中断当前函数, 把异常抛给上⼀级函数, 所以当前函数finally后⾯的语句不会被执⾏.例⼦:[java]1. package Exception_kng;2.3. import .*;4. import java.io.*;5.6. class Exp4{7. public int f(int a, int b) throws IOException, BindException{8. return a/b;9. }10. }11.12. public class Expt_4{13. public static void g(){14. Exp4 ex = new Exp4();15. int i = 22;16. try{17. System.out.printf("g() : try!!\n"); //failed18. i = ex.f(8,0); //call f()19. }20. catch(BindException e){21. System.out.printf("g() : BindException!!\n"); //failed22. }23. catch(IOException e){24. System.out.printf("g() : IOException!!\n"); //failed25. }26. finally{27. System.out.printf("g() : finaly!!\n"); //successfully executed28. }29. System.out.printf("g() is done!!\n"); //failed30. }31.32. public static void h(){33. try{34. g();35. }catch(ArithmeticException e){36. System.out.printf("Exception occurs!!\n");37. System.out.println(e.getMessage()); //print the root cause38. System.out.printf("===========================\n");39. e.printStackTrace(); //print the info of function stuck.40. }41.42. System.out.printf("h() is done!!\n"); //successfully executed43. }44. }我所说的情况, 就在上⾯例⼦⾥的g()函数, g()函数⾥尝试捕捉两个异常, 但是抛出了第3个异常(ArithmeticException 算术异常).所以这个异常会中断g()的执⾏, 因为没有被捕捉到, 然后抛给调⽤g()的 h()函数处理, ⽽在h()捕捉到了, 所以h()函数是能完整执⾏的.也就是说g()⾥的[java]1. System.out.printf("g() is done!!\n"); //failed执⾏失败⽽h()⾥的[java]1. System.out.printf("h() is done!!\n"); //successfully executed执⾏成功但是⽆论如何, g()⾥的finally{}部分还是被执⾏了执⾏结果如下:[java]1. [java] g() : try!!2. [java] g() : finaly!!3. [java] Exception occurs!!4. [java] / by zero5. [java] ===========================6. [java] ng.ArithmeticException: / by zero7. [java] at Exception_kng.Exp4.f(Expt_4.java:8)8. [java] at Exception_kng.Expt_4.g(Expt_4.java:18)9. [java] at Exception_kng.Expt_4.h(Expt_4.java:34)10. [java] at Enter_1.main(Enter_1.java:31)11. [java] h() is done!!这种情况是1中编程的低级错误, 在项⽬中是不允许出现.避免⽅法也⼗分简单, 在catch⼦句集的最后增加1个catch(Exception e)就ok, 因为Exception是所有异常的超类, 只要有异常抛出, 则肯定会捕捉到.4.3.2 在catch⼦句内有return⼦句.下⾯例⼦:[java]1. try{2. f();3. ff();4. }5. catch(ArithException e){6. g();7. return j();8. }9. catch(IOException e){10. gg();11. return j();12. }13. catch(AuthorizedException e){14. ggg();15. return j();16. }17. finally{18. h();19. }20.21. k();假如在f()函数抛出了IOExcepion 异常被捕捉到.那么执⾏路线就是f() -> gg() -> j() -> h() -> 上⼀级function也就说, 这种情况下finally⾥的⼦句会在return回上⼀级function前执⾏. ⽽后⾯的k()就被放弃了.4.3.3 finally作⽤⼩结.可以看出, finally⾥的语句, ⽆论如何都会被执⾏.⾄有两种情况除外, ⼀是断电, ⼆是exit函数.在项⽬中, 我们⼀般在finally编写⼀些释放资源的动作, 例如初始化公共变量. 关闭connections, 关闭⽂件等.4.4 try catch finally⾥⼀些要注意的问题.4.4.1 ⽆论如何最多只有1个catch被执⾏这个上⾯提到过了, ⼀旦捕捉到1个异常, 就不会尝试捕捉其他异常.如果try⾥⾯的⼀段代码可能抛出3种异常A B C,⾸先看它先抛出哪个异常, 如果先抛出A, 如果捕捉到A, 那么就执⾏catch(A)⾥的代码. 然后finally.. B和C就没有机会再抛出了.如果捕捉不到A, 就执⾏finally{}⾥的语句后中断当前函数, 抛给上⼀级函数...(应该避免)4.4.2 有可能所有catch都没有被执⾏两种情况, 1就是没有异常抛出, 另⼀种就是抛出了异常但是没有捕捉不到(应该避免)4.4.3 先捕捉⼦类异常, 再捕捉⽗类异常, 否则编译失败加⼊try ⾥⾯尝试捕捉两个异常, 1个是A, 1个是B, 但是A是B的⽗类.这种情况下, 应该把catch(B)写在catch(A)前⾯.原因也很简单, 加⼊把catch(A)写在前⾯, 因为多态的存在, 即使抛出了B异常, 也会被catch(A)捕捉, 后⾯的catch(B)就没有意义了.也就是说如果捕捉Exception这个异常基类, 应该放在最后的catch⾥, 项⽬中也强烈建议这么做, 可以避免上述4.3.1的情况出现.4.4.4 catch与catch之间不能有任何代码.这个没什么好说的. 语法规则4.4.5 finally⾥不能访问catch⾥捕捉的异常对象e每1个异常对象只能由catch它的catch⼦句⾥访问.4.4.6 try⾥⾯的定义变量不能在try外⾯使⽤.跟if类似, 不多说了.4.4.7 try catch finally可以嵌套使⽤.这个也不难理解..五, throw 和throws的机制和⽤法.下⾯开始详讲异常另⼀种处理⽅法throw 和 throws了.注意的是, 这两种⽤法都没有真正的处理异常, 真正处理的异常⽅法只有try catch, 这两种⽅法只是交给上⼀级⽅法处理.就如⼀个组织⾥ , 有1个⼤佬, 1个党主, 1个⼩弟.⼤佬叫党主⼲活, 堂主叫⼩弟⼲活, 然后⼩弟碰上⿇烦了, 但是⼩弟不会处理这个⿇烦, 只能中断⼯作抛给党主处理, 然后堂主发现这个⿇烦只有⼤佬能处理, 然后抛给⼤佬处理..道理是相通的..5.1 throw 的语法与作⽤throws的语法很简单.语法:throw new XException();其中xException必须是Exception的派⽣类.这⾥注意throw 出的是1个异常对象, 所以new不能省略作⽤就是⼿动令程序抛出1个异常对象.5.2 throw 1个 RuntimeException及其派⽣类我们看回上⾯3.2 的例⼦:[java]1. public int f(int a, int b){2. if (0 == b){3. throw new ArithmeticException("Shit !!! / by zero!");4.5. }6.7. return a/b;8. }5.2.1 throw会中断当前函数, 当前函数执⾏失败(不完整)当这个函数的if 判断了b=0时, 就利⽤throws⼿动抛出了1个异常. 这个异常会中断这个函数. 也就是说f()执⾏不完整, 是没有返回值的.5.2.2, 接下来哪个调⽤这个函数就会在调⽤这个函数的语句上收到异常.[java]1. public void g(){2. int i;3. h();4. i = f(); //recevie excepton5. k();6. }例如上没的g()函数, 在调⽤f() 会收到1个异常.这时g()函数有三种选择.1. 不做任何处理这时, g()收到f()⾥抛出的异常就会打断g()执⾏, 也就是说g()⾥⾯的k(); 被放弃了, 然后程序会继续把这个函数抛给调⽤g()函数.然后⼀级⼀级寻求处理, 如果都不处理, 则抛给jvm处理. jvm会中断程序, 输出异常信息. 这个上没提到过了.2. 使⽤try catch处理如果catch成功, 则g()函数能完整执⾏, ⽽且这个异常不会继续向上抛.如果catch失败(尽量避免), 则跟情况1相同.5.3 throw 1个⾮RuntimeException派⽣类的异常将上⾯的例⼦改⼀下:[java]1. public int f(int a, int b){2. if (0 == b){3. throw new IOException("Shit !!! / by zero!");4. }5.6. return a/b;7. }例如, 我不想抛出ArithmeticException, 我想抛出IOExcetpion.注意这⾥, IOException虽然逻辑上是错误的(完全不是IO的问题嘛), 但是在程序中完全可⾏, 因为程序猿可以根据需要控制程序指定抛出任何1个异常.但是这段代码编译失败, 因为IOException 不是 RuntimeException的派⽣类.java规定:5.3.1 如果⼀个⽅法⾥利⽤throw⼿动抛出1个⾮RuntimeException异常, 必须在函数定义声明⾥加上throws 后缀改成这样就正确了:[java]1. public int f(int a, int b) throws IOException{2. if (0 == b){3. throw new IOException("Shit !!! / by zero!");4. }5.6. return a/b;7. }注意在⽅法定义⾥加上了throws⼦句. 告诉调⽤它的函数我可能抛出这个异常.5.3.2 调⽤该⽅法的⽅法则必须处理这个异常例如抄回上⾯的例⼦, g()调⽤f()函数.[java]1. public void g(){2. int i;3. h();4. i = f(); //recevie excepton5. k()6. }但是编译失败.因为f()利⽤throws 声明了会抛出1个⾮runtimeExcetpion. 这时g()必须做出处理.处理⽅法有两种:1. try catch⾃⼰处理:[java]1. public void g(){2. int i = 0;3. h();4. try{5. i = f(); //recevie excepton6. }7. catch(IOException e){8.9. }10. k();11. }需要注意的是, catch⾥⾯要么写上throws对应的异常(这⾥是 IOException), 要么写上这个异常的超类, 否则还是编译失败.2.g()利⽤throws 往上⼀级⽅法抛.[java]1. public void g() throws IOException{2. int i = 0;3. h();4. i = f(); //recevie excepton5. k();6. }这是调⽤g()的函数也要考虑上⾯的这两种处理⽅法了...但是最终上级的⽅法(main ⽅法)还是不处理的话, 就编译失败, 上⾯说过了, ⾮runtimeException⽆法抛给jvm处理.虽然这两种处理⽅法都能通过编译, 但是运⾏效果是完全不同的.第⼀种, g()能完整执⾏.第⼆种, g()被中断, 也就是g()⾥⾯的k(); 执⾏失败.5.4 throws 的语法.throws稍微⽐throw难理解点:语法是:public void f() throws Exception1, Exception2...{}也就是讲, thorws可以加上多个异常, 注意这⾥抛出的不是对象, 不能加上new.⽽且不是告诉别⼈这个函数有可能抛出这么多个异常. ⽽是告诉别⼈, 有可能抛出这些异常的其中⼀种.5.5 throws 的作⽤.如果为f()函数加上throws后续, 则告诉调⽤f()的⽅法, f()函数有可能抛出这些异常的⼀种.如果f()throws 了1个或若⼲个⾮RuntimeException, 则调⽤f()的函数必须处理这些⾮RuntimeException, 如上⾯的g()函数⼀样.如果f() throws的都是RuntimeException, 则调⽤f()的函数可以不处理, 也能通过编译, 但是实际上还是强烈建议处理它们.实际上, 如果1个⽅法f() throws A,B那么它有可能不抛出任何异常.(程序运⾏状态良好)也有能抛出C异常(应该避免, 最好在throws上加上C)5.6 什么时候应该⽤throws5.6.1 ⼀个函数体⾥⾯⼿动throw了1个RumtimeException, 则这个函数的定义必须加上throws⼦句这个是强制, 告诉别⼈这个函数内有炸弹.5.6.2 ⼀个函数内有可能由系统抛出异常.这个是⾮强制的, 但是如果你知道⼀个函数内的代码有可能抛出异常, 最好还是写上throws 后缀⽆论这个异常是否runtimeExcepion.5.7 ⼀般情况下,调⽤1个带有throws⽅法时怎么办个⼈建议, 如果你调⽤1个函数throws A, B, C那么你就在当前函数写上catch(A)catch(B)catch(C)catch(Exception)这样能处理能保证你的函数能完整执⾏, 不会被收到的异常中断.当然如果你允许你的函数可以被中断, 那么就可以在当前函数定义加上throws A, B 继续抛给上⼀级的函数.5.8 重写⽅法时, throws的范围不能⼤于超类的对应⽅法.例如你在⼀个派⽣类重写⼀个⽅法f(), 在超类⾥的f() throws A, B 你重写⽅法时就不throws出 A,,B,C 或者throws A和B的超类.原因也是由于多态的存在.因为1个超类的引⽤可以指向1个派⽣类的对象并调⽤不同的⽅法. 如果派⽣类throws的范围加⼤那么利⽤多态写的代码的try catch就不再适⽤.六, throw和throws⼀些主要区别.⾯试问得多,单独拉出来写了:6.1 throw 写在函数体内, throws写在函数定义语句中.应付⾯试官.6.2 throw 是抛出1个异常对象, throws是有能抛出异常的种类所以throw后⾯的⼀般加上new 和exception名字().⽽throws后⾯不能加上new的6.3 ⼀个⽅法最多只能throw1个异常, 但是可以throws多个种类异常因为⼀旦⼀个函数throw出1个异常, 这个函数就会被中断执⾏, 后⾯的代码被放弃, 如果你尝试在函数内写两个throw, 编译失败.⽽throws 是告诉别⼈这个函数有可能抛出这⼏种异常的⼀种. 但是最多只会抛出⼀种.6.4 如果在⼀个函数体内throw 1个⾮runtimeException, 那么必须在函数定义上加上throws后缀. 但反过来就不是必须的.原因上⾯讲过了.七, ⾃定义异常.我们可以⾃定义异常, 只需要编写1个类, 继承1个异常类就ok例⼦:[java]1. package Exception_kng;2.3. class User_Exception1 extends ArithmeticException{4. public User_Exception1(String Exception_name){5. super(Exception_name);6. }7.8. public void printStackTrace(){ //overwrite9. super.printStackTrace();10. System.out.printf("hey man, i am an user_defined excetpion\n");11. }12. }13.14. class Exp6{15. public int f(int a, int b){16. if (0 == b){17. throw new User_Exception1("Shit !!! / by zero!"); //use User_defined exception18. }19.20. return a/b;21. }22. }23.24. public class Expt_6{25. public static void g() {26. Exp6 ex = new Exp6();27. int i = 22;28. try{29. i = ex.f(8,0); //throw excetpion30. }catch(User_Exception1 e){31. e.printStackTrace();32. }33. System.out.printf("i is %d\n", i);34. System.out.printf("g() is done!!\n");35. }36. }上⾯的类User_Exception1 就是1个⾃定义异常, 并重写了printStackTrace()⽅法.⼋,java异常的优缺点.8.1 c语⾔是如何处理程序错误的.我们要理解异常的优缺点, ⾸先看看没有异常的是如何处理错误的.下⾯是个例⼦:[cpp]1. //openfile2. if (fileOpen() > 0){3. //check the length of the file4. if (gotLengthOfTheFile() > 0){5. //check the memory6. if (gotEnoughMemory() > 0){7. //load file to memory8. if (loadFileToMem() > 0){9. readFile();10. }else{11. errorCode = -5;12. }13.14. }else{15. errorCode = -5;16. }17.18. }else{19. errorCode = -5;20. }21.22. }else{23. errorCode = -5;24. }25.26. //handle error27. case errorCode....28.29. //release Source30. releaseSource();可以见到处理错误有这些特点1. ⼤部分精⼒都在错误处理.2. 需要把各种可能出现的错误全部考虑到, 才能保证程序的稳定性.3. 程序可读性差, 错误处理代码混杂在其他代码中.4. 出错返回信息少, ⼀旦出错难以调试.5. ⼀旦出现了未考虑到的错误, 资源释放代码⽆法执⾏.8.2 java异常机制下是如何编写上述代码的.[java]1. try{2. fileOpen();3. gotLengthOfTheFile();4. gotEnoughMemory();5. loadFileToMem();6. readFile();7. }8. catch(fileOpenFail) { handle1()}9. catch(gotLengthOfTheFileFail) { handle2()}10. catch(gotEnoughMemoryFail) { handle3()}11. catch(loadFileToMemFail) { handle4()}12. catch(readFileFail) { handle4()}13. catch(Exception e) { handle5()} //catch unexpected error14. finally{15. releasSource();16. }8.3 java异常机制的优点:由上⾯的代码可以看出部分优点:1. 业务代码和错误处理代码分离.2. 强制程序猿考虑程序的稳定性.3. 有利于代码调试(异常信息)4. 即使任何异常产⽣, 能保证占⽤的释放(finally)8.4 java异常机制的缺点:1. 异常嵌套难免影响代码可读性2. 并不能令程序逻辑更加清晰.3. 异常并不能解决所有问题。

Java中异常的捕获与处理

Java中异常的捕获与处理

Java中异常的捕获与处理⼀、Java异常简介什么是异常?程序运⾏时,发⽣的不被期望的事件,它阻⽌了程序按照程序员的预期正常执⾏,这就是异常。

异常发⽣时,是任程序⾃⽣⾃灭,⽴刻退出终⽌。

在Java中即,Java在编译或运⾏或者运⾏过程中出现的错误。

Java提供了更加优秀的解决办法:异常处理机制。

异常处理机制能让程序在异常发⽣时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最⼤可能恢复正常并继续执⾏,且保持代码的清晰。

Java中的异常可以是函数中的语句执⾏时引发的,也可以是程序员通过throw 语句⼿动抛出的,只要在Java程序中产⽣了异常,就会⽤⼀个对应类型的异常对象来封装异常,JRE就会试图寻找异常处理程序来处理异常。

Java异常机制⽤到的⼏个关键字:try、catch、finally、throw、throws。

try -- ⽤于监听。

将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发⽣异常时,异常就被抛出。

catch -- ⽤于捕获异常。

catch⽤来捕获try语句块中发⽣的异常。

finally -- finally语句块总是会被执⾏。

它主要⽤于回收在try块⾥打开的物⼒资源(如数据库连接、⽹络连接和磁盘⽂件)。

只有finally 块,执⾏完成之后,才会回来执⾏try或者catch块中的return或者throw语句,如果finally中使⽤了return或者throw等终⽌⽅法的语句,则就不会跳回执⾏,直接停⽌。

throw -- ⽤于抛出异常。

throws -- ⽤在⽅法签名中,⽤于声明该⽅法可能抛出的异常。

主⽅法上也可以使⽤throws抛出。

如果在主⽅法上使⽤了throws抛出,就表⽰在主⽅法⾥⾯可以不⽤强制性进⾏异常处理,如果出现了异常,就交给JVM进⾏默认处理,则此时会导致程序中断执⾏。

产⽣异常的原因:⽤户输⼊了⾮法数据。

要打开的⽂件不存在。

简述java中的异常处理机制

简述java中的异常处理机制

简述java中的异常处理机制一、概述Java是一种面向对象的编程语言,其异常处理机制是其核心特性之一。

Java的异常处理机制可以让程序员在代码中处理预期和未预期的错误情况,从而提高程序的稳定性和可靠性。

二、异常分类Java中的异常分为两类:受检异常(checked exception)和非受检异常(unchecked exception)。

1. 受检异常受检异常是指在编译时就能够被捕获到的异常,必须要进行处理。

这些异常通常是由于外部环境或用户输入导致的,例如文件不存在、网络连接失败等。

2. 非受检异常非受检异常是指在运行时才能够被捕获到的异常,不需要进行处理。

这些异常通常是由于程序逻辑错误或内存问题导致的,例如空指针引用、数组下标越界等。

三、Exception类及其子类Java中所有的异常都继承自Exception类或RuntimeException类。

其中Exception类包括了所有受检异常,而RuntimeException类包括了所有非受检异常。

1. Exception类Exception类包括了许多子类,如IOException、SQLException等。

这些子类都需要在方法声明中使用throws关键字进行声明或使用try-catch语句进行捕获和处理。

2. RuntimeException类RuntimeException类包括了许多子类,如NullPointerException、ArrayIndexOutOfBoundsException等。

这些子类可以在方法中直接抛出,不需要进行声明或捕获处理。

四、异常处理方式Java中有两种异常处理方式:try-catch语句和throws关键字。

1. try-catch语句try-catch语句用于捕获异常并进行处理。

其基本语法如下:```try {// 可能会抛出异常的代码} catch (ExceptionType e) {// 异常处理代码}```其中,ExceptionType指的是要捕获的异常类型,可以是任何Exception类或其子类。

Java中的异常处理机制

Java中的异常处理机制

Java中的异常处理机制Java是一种面向对象的编程语言,异常处理是Java编程中非常重要的一个方面。

在Java程序中,异常是指程序执行时的错误或异常状况。

如果不处理异常,则程序将终止执行并抛出一个异常。

Java语言提供了一种异常处理机制,使程序员能够有效地处理异常情况,提高程序的健壮性和可靠性。

异常处理机制可以帮助我们更好地管理程序的运行过程,提高代码的可读性和重用性。

Java异常处理机制的本质是一个异常对象的抛掷和接收机制,它由以下三个部分组成:异常的产生、异常的抛掷和异常的接收与处理。

一、异常的产生异常通常由以下几种情况产生:1. 编程人员故意或错误地抛出一个异常,如:throw new Exception("自定义异常")。

2. 运行时出现错误,如:数组越界、空指针等。

3. 系统出现异常,如:文件无法打开、网络连接中断等。

二、异常的抛掷当程序中出现异常时,有两种方式来抛出异常:1. 使用throw语句抛出异常,如:throw new Exception("自定义异常")。

2. 让系统自动抛出异常,如:空指针引用异常、除零异常等。

抛出异常后,程序会停止执行,并将异常对象抛出到调用该方法的地方。

如果该方法没有捕获异常,则该方法终止执行并将异常传递给调用该方法的下一个方法,直到异常被捕获或到达程序的顶层。

三、异常的接收与处理接收并处理异常是Java中异常处理机制的最后一步。

如果异常被捕获,程序将通过捕获异常的处理程序继续执行,而不会终止程序的执行。

Java中提供了try-catch语句块来捕获异常。

try-catch语句块的语法结构如下:try{代码块 //有可能抛出异常的代码}catch(异常类型1 异常变量名){代码块 //异常类型1的处理逻辑}catch(异常类型2 异常变量名){代码块 //异常类型2的处理逻辑}当try语句块中的代码抛出一个异常时,会跳转到匹配该异常类型的catch语句块。

java异常处理机制详解

java异常处理机制详解

java异常处理机制详解转⾃:/hy928302776/archive/2013/04/22/3035504.html异常机制已经成为判断⼀门编程语⾔是否成熟的标准,异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提⾼程序健壮性。

Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。

1.try:它⾥⾯放置可能引发异常的代码2.catch:后⾯对应异常类型和⼀个代码块,⽤于表明该catch块⽤于处理这种类型的代码块,可以有多个catch块。

3.finally:主要⽤于回收在try块⾥打开的物⼒资源(如数据库连接、⽹络连接和磁盘⽂件),异常机制总是保证finally块总是被执⾏。

只有finally 块,执⾏完成之后,才会回来执⾏try或者catch块中的return或者throw语句,如果finally中使⽤了return或者 throw等终⽌⽅法的语句,则就不会跳回执⾏,直接停⽌。

4.throw:⽤于抛出⼀个实际的异常,可以单独作为语句使⽤,抛出⼀个具体的异常对象。

5.throws:⽤在⽅法签名中,⽤于声明该⽅法可能抛出的异常。

Java的异常分为两种,checked异常(编译时异常)和Runtime异常(运⾏时异常)1. java认为checked异常都是可以再编译阶段被处理的异常,所以它强制程序处理所有的checked异常,⽽Runtime异常⽆须处理,java程序必须显式处理checked异常,如果程序没有处理,则在编译时会发⽣错误,⽆法通过编译。

2. checked异常体现了java设计哲学:没有完善处理的代码根本不会被执⾏,体现了java的严谨性,对于构造⼤型、健壮、可维护的应⽤系统⽽⾔,错误处理是整个应⽤需要考虑的重要⽅⾯。

Java异常处理机制,在程序运⾏出现意外时,系统会⽣成⼀个Exception对象,来通知程序,从⽽实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。

Java异常处理面试题集

Java异常处理面试题集

Java异常处理面试题集在Java编程中,异常处理是一个非常重要的概念。

异常是指在程序执行过程中发生的意外情况,例如除零错误、空指针引用等。

正确处理异常可以提高程序的健壮性和可靠性。

以下是一些常见的Java异常处理面试题,帮助你更好地理解和运用异常处理机制。

1. 什么是异常?Java中的异常是如何分类的?在Java中,异常是指在程序运行过程中出现的错误或问题。

异常可以分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。

- 受检异常是在代码编译阶段就需要进行处理的异常,必须使用try-catch语句块或者在方法签名中使用throws关键字声明。

- 非受检异常是在运行时期出现的异常,不需要进行强制处理。

常见的非受检异常有NullPointerException、ArrayIndexOutOfBoundsException等。

2. 什么是try-catch语句块?如何使用try-catch语句块处理异常?try-catch语句块是用于捕获和处理异常的一种语法结构。

它的基本形式如下:```javatry {// 可能抛出异常的代码} catch (ExceptionType1 e1) {// 处理ExceptionType1类型的异常} catch (ExceptionType2 e2) {// 处理ExceptionType2类型的异常} finally {// 可选的finally代码块,无论是否发生异常,都会执行}```在try代码块中,我们放置可能抛出异常的代码。

如果在try代码块中发生了异常,程序将立即跳转到对应的catch代码块中进行异常处理。

catch代码块中的参数是捕获到的异常对象,可以利用该对象进行异常处理。

finally代码块是可选的,无论是否发生异常,都会执行。

3. Java中的异常处理机制的优点是什么?Java的异常处理机制具有以下优点:- 提高代码可读性和可维护性:将异常处理代码与正常业务逻辑分离,使代码清晰易懂;- 改善系统稳定性:合理处理异常可以防止程序崩溃,提高系统稳定性;- 快速定位问题:异常提供了有用的错误信息,帮助开发人员快速定位并解决问题;- 适应不同的处理需求:可以根据实际需求,选择抛出异常或捕获异常进行处理。

Java异常处理之异常处理机制一:try-catch-finally

Java异常处理之异常处理机制一:try-catch-finally

Java异常处理之异常处理机制⼀:try-catch-finally⼀、Java 异常处理 编写程序时,要在出现可能出现错误的时候加上检测的代码,如判断分母为0,数据为空,过多的 if-else分⽀导致程序代码加长,臃肿,可读性差,因此采⽤异常处理机制。

Java采⽤的异常处理机制,是将异常处理的程序代码集中在⼀起,与正常的程序代码分开,使得程序简洁、优雅,并易于维护。

⼆、异常处理:抓抛模型 1、抛出 Java 程序的执⾏过程中出现异常,会⽣成⼀个异常类对象,该异常对象将被提交给 Java 运⾏时系统,这个过程称为抛出(throw)异常。

⼀旦抛出对象以后,其后的代码就不再执⾏。

2、捕获、“抓” 可以理解为异常的处理⽅式:① try-catch-finally; ② throws; 3、异常对象的⽣成 (1)由虚拟机⾃动⽣成:程序运⾏过程中,虚拟机检测到程序发⽣了问题,如果在当前代码中没有找到相应的处理程序,就会在后台⾃动创建⼀个对应异常类的实例对象并抛出——⾃动抛出; (2)由开发⼈员⼿动创建:Exception exception = new ClassCastException;——创建好的异常对象不抛出对程序没有任何影响,和创建⼀个普通对象⼀样; 4、处理异常过程 (1)当程序运⾏到某⼀句时,发⽣了异常,那么程序会先停下来; (2)程序会在这句代码处,查看原因,⽣成⼀个合理“异常对象”,然后“抛”出; (3)JVM 会检测这句代码的外围,是否有 try...catch 结构,可以“捕获”它; (4)如果可以捕获,那么程序在处理完异常后,继续下⾯的运⾏,不会崩溃; (5)如果不能捕获,那么会把这个异常继续抛给“上级”,如果“上级”能处理,那么程序从“上级"处理完的代码后⾯继续运⾏; (6)如果上级也不能处理,那么继续往上抛,⼀直到达JVM,那么就“崩溃”; ①如果⼀个⽅法内抛出异常,该异常对象会被抛给调⽤者⽅法中处理。

Java异常处理机制的研究

Java异常处理机制的研究

Ar h tc c p i ( ) t me iEx e t on )
同 传 统 的 方 法 相 比 , 常 处 理 具 有 许 E cpin 算 术 异 xe t , o
运 算 异 常

c th( rhmeiEx e to { ac A t t c c p ine)
S se o t p i l e ; y tm. u . rntn( )
ห้องสมุดไป่ตู้
Jv a a语 言 处 理 异 常 中 涉 及 两 方 面 操 无 需 让 Jv 行 系 统 来 处 理 ; 于 无 法 预 aa运 对
将 错 误 按 错 误 类 型 和 差 别 分 组 , 对 不 同 操 作 出 错 。 AWTE cpin 处 理 使 用 程 序 能 够 正 常 运 行 。一 般 来 说 , 设 计 程 针 xe t o 在
错 误 采 用 不 同 的类 来 处 理 , 服 了 传 统 方 AWT 包 出现 的错 误 等 。 克
② 发 生 异 常 的 位 置 : 以 通 过 T r w be 可 ho al 类 的 pit tc T ae ) 法 获 取 , 过 程 r Sak rc (方 n 该
类 错 误 可 能 是 逻 辑 错 误 也 可 能 是 系 统 错 尽 的 情 形 。 x e t n类 供 应 用 程 序 使 用 , E cpi o 误 , 程 序 中 出现 死 循 环 或 者 数 组 引 用 超 用 户 可 以 在 程 序 使 用 E cpin类 处 理 如 xe t o
t m t E cpi c o 如 )等 。 多 优 点 :aa的异 常 处 理 机 制 出 来 将 错 误 Arh ei xe t n ( 除 数 为 0 Jv xe t o 如 传 播 给 调 用 调 用 堆 栈 来 统 一 调 用 。 错误 E cpin 类 还 有 其 他 几 个 子 类 , : 把

java 异常处理机制

java 异常处理机制

java 异常处理机制Java 异常处理机制Java 是一门强类型、面向对象、解释性语言,它的异常处理机制使得程序的可靠性大大提升。

当 Java 程序运行时,一旦出现异常,就必须通过异常处理机制来防止程序崩溃,并进行错误的处理。

本文将重点介绍 Java 的异常处理机制。

一、什么是异常处理?异常(exception)是程序运行时出现的非正常情况,如一个数除以零、文件不存在等。

发生异常后,程序通常不再继续进行下去,而是采取相应的措施,比如输出错误信息、关闭文件、弹出对话框等。

异常处理(exception handling)是程序针对异常的一种机制,它可以捕捉异常并进行相应的处理,从而保证程序的正常运行。

Java 异常分类Java 异常可以分为三类:运行时异常、受检异常和错误。

1. 运行时异常(RuntimeException)运行时异常也称为非检查异常,这类异常在程序运行时可能发生,但编译器在编译时并不会检查其是否处理。

主要包括:- 空指针异常(NullPointerException)- 数组下标越界异常(ArrayIndexOutOfBoundsException)- 数字格式异常(NumberFormatException)- 类型转换异常(ClassCastException)- ……2. 受检异常(CheckedException)受检异常需要在代码中显式地处理或声明抛出。

这类异常通常不是由程序错误引起的,而是由外部因素导致,如文件不存在、网络连接断开等。

主要包括:- 文件不存在异常(FileNotFoundException)- IO 异常(IOException)- SQL 异常(SQLException)- ……3. 错误(Error)错误通常指与虚拟机相关的问题,如栈溢出、内存不足等。

错误不需要程序显式地处理,通常也很难处理。

主要包括:- OutOfMemoryError- StackOverflowError- NoClassDefFoundError- ……Java 异常处理机制Java 异常处理机制的核心思想是“捕捉和处理异常”,这通过以下关键字和语句来实现:1. try-catch 语句try-catch 语句用于捕获异常并进行处理。

java numberformatexception异常处理机制实例

java numberformatexception异常处理机制实例

java numberformatexception异常处理机制实例Java中的NumberFormatException异常处理机制实例NumberFormatException是Java语言中的一个常见异常,用于指示在字符串转换为数字的过程中出现了错误。

在许多编程任务中,我们会遇到需要将用户输入的字符串转换为数字的情况,但是如果用户输入的字符串无法转换为有效数字,就会抛出NumberFormatException异常。

本文将介绍NumberFormatException异常的原因、处理机制及相关实例。

一、NumberFormatException异常的原因NumberFormatException异常的产生是由于字符串无法或不符合要求地转换为数字导致的。

例如,当我们尝试将包含字母、特殊字符或指数记数法的字符串转换为数字时,就会抛出NumberFormatException异常。

下面是一些示例:javaString str1 = "abc";int num1 = Integer.parseInt(str1); 抛出NumberFormatException异常String str2 = "10.5";int num2 = Integer.parseInt(str2); 抛出NumberFormatException异常String str3 = "1e5";int num3 = Integer.parseInt(str3); 抛出NumberFormatException异常上述示例中,str1包含字母字符,str2包含小数点,str3包含指数记数法,这些字符串都无法转换为整数,因此会抛出NumberFormatException 异常。

二、NumberFormatException异常的处理机制为了避免NumberFormatException异常的发生,我们可以使用异常处理机制来捕获并处理它。

Java运行时异常和非运行时异常

Java运行时异常和非运行时异常

Java运⾏时异常和⾮运⾏时异常1.异常机制Java把异常当做对象来处理,并定义⼀个基类ng.Throwable作为所有异常的超类。

Java中的异常分为两⼤类:错误Error和异常Exception,Java异常体系结构如下图所⽰:2.ThrowableThrowable类是所有异常或错误的超类,它有两个⼦类:Error和Exception,分别表⽰错误和异常。

其中异常Exception分为运⾏时异常(RuntimeException)和⾮运⾏时异常,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

3.Error⼀般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误⽆法恢复或不可能捕获,将导致应⽤程序中断,通常应⽤程序⽆法处理这些错误,因此应⽤程序不应该捕获Error对象,也⽆须在其throws⼦句中声明该⽅法抛出任何Error或其⼦类。

4.可查异常和不可查异常通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。

可查异常(编译器要求必须处置的异常):正确的程序在运⾏中,很容易出现的、情理可容的异常状况。

可查异常虽然是异常状况,但在⼀定程度上它的发⽣是可以预计的,⽽且⼀旦发⽣这种异常状况,就必须采取某种⽅式进⾏处理。

除了RuntimeException及其⼦类以外,其他的Exception类及其⼦类都属于可查异常。

这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么⽤try-catch语句捕获它,要么⽤throws⼦句声明抛出它,否则编译不会通过。

不可查异常(编译器不要求强制处置的异常):包括运⾏时异常(RuntimeException与其⼦类)和错误(Error)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这里,ExceptionType 是发生异常的类型。下面将介绍怎样应用这个框架。
10.2
异 常 类 型
所有异常类型都是内置类Throwable的子类。 因此, Throwable在异常类层次结构的顶层。 紧接着Throwable下面的是两个把异常分成两个不同分支的子类。一个分支是Exception。该 类用于用户程序可能捕捉的异常情况。 它也是你可以用来创建你自己用户异常类型子类的类。 在Exception分支中有一个重要子类RuntimeException。该类型的异常自动为你所编写的程序 定义并且包括被零除和非法数组索引这样的错误。
当这个版本代替原程序中的版本,程序在标准javaJDK解释器下运行,每一个被零除错 误显示下面的消息:
Exception: ng.ArithmeticException: / by zero
尽管在上下文中没有特殊的值, 显示一个异常描述的能力在其他情况下是很有价值的— —特别是当你对异常进行实验和调试时。
class Exc1 { static void subroutine() { int d = 0; int a = 10 / d; } public static void main(String args[]) { Exc1.subroutine(); } }
默认异常处理器的堆栈轨迹结果表明了整个调用栈是怎样显示的:
10.4.1 显示一个异常的描述 Throwable重载toString( ) 方法(由Object定义),所以它返回一个包含异常描述的字符 串。 你可以通过在println( )中传给异常一个参数来显示该异常的描述。 例如, 前面程序的catch 块可以被重写成
catch (ArithmeticException e) { System.out.println("Exception: " + e); a = 0; // set a to zero and continue }
保密申明:秘密级
如你所见,栈底是main的第7行,该行调用了subroutine( ) 方法。该方法在第4行导致了 异常。调用堆栈对于调试来说是很重要的,因为它查明了导致错误的精确的步骤。
10.4
使用try和catch
尽管Java运行时系统提供的默认异常处理程序对于调试是很有用的, 但通常你希望自己 处理异常。这样做有两个好处。第一,它允许你修正错误。第二,它防止程序自动终止。大 多数用户对于在程序终止 运行和在无论何时错误发生都会打印堆栈轨迹感到很烦恼(至少可以这么说)。幸运的是, 这很容易避免。 为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了。 紧跟着try块的后面包括一个说明你希望捕获错误类型的catch子句。完成这个任务很简单, 下面的程序包含一个处理因为被零除而产生的ArithmeticException 异常的try块和一个catch 子句。
Generated by Foxit PDF Creator © Foxit Software For evaluation only.
保密申明:秘密级
另一类分支由Error作为顶层, Error定义了在通常环境下不希望被程序捕获的异常。 Error 类型的异常用于Java运行时系统来显示与运行时系统本身有关的错误。 堆栈溢出是这种错误 的一例。本章将不讨论关于Error类型的异常处理,因为它们通常是灾难性的致命错误,不 是你的程序可以控制的。
ng.ArithmeticException: / by zero at Exc1.subroutine(Exc1.java:4) at Exc1.main(Exc1.java:7)
Generated by Foxit PDF Creator © Foxit Software For evaluation only.
Generated by Foxit PDF Creator © Foxit Software For evaluation only.
保密申明:秘密级
iCarnegie Java 教材 版本:1.0
作者: 审批:
Daniel Zhang
日期: 日期:
10.1
异常处理基础
Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象。当异常情况发 生,一个代表该异常的对象被创建并且在导致该错误的方法中被引发(throw)。该方法可 以选择自己处理异常或传递该异常。两种情况下,该异常被捕获(caught)并处理。异常可 能是由Java运行时系统产生,或者是由你的手工代码产生。被Java引发的异常与违反语言规 范或超出Java执行环境限制的基本错误有关。 手工编码产生的异常基本上用于报告方法调用 程序的出错状况。 Java异常处理通过5个关键字控制:try、catch、throw、throws和 finally。下面讲述它们 如何工作的。程序声明了你想要的异常监控包含在一个try块中。如果在try块中发生异常, 它被抛出。你的代码可以捕捉这个异常(用catch)并且用某种合理的方法处理该异常。系 统产生的异常被Java 运行时系统自动引发。手动引发一个异常,用关键字throw。任何被引 发方法的异常都必须通过throws子句定义。任何在方法返回前绝对被执行的代码被放置在 finally块中。 下面是一个异常处理块的通常形式:
10.3
未被捕获的异常
在你学习在程序中处理异常之前, 看一看如果你不处理它们会有什么情况发生。 下面的 小程序包括一个故意导致被零除错误的表达式。
class Exc0 { public static void main(String args[]) { int d = 0; int a = 42 / d; } }
class Exc2 { public static void main(String args[]) { int d, a; try { // monitor a block of code. d = 0; a = 42 / d; System.out.println("This will not be printed."); } catch (ArithmeticException e) { // catch divide-by-zero error System.out.println("Division by zero."); } System.out.println("After catch statement."); } }
ng.ArithmeticException: / by zero at Exc0.main(Exc0.java:4)
注意,类名Exc0,方法名main,文件名Exc0.java和行数4是怎样被包括在一个简单的堆 栈使用轨迹中的。还有,注意引发的异常类型是Exception的一个名为ArithmeticException的 子类,该子类更明确的描述了何种类型的错误方法。本章后面部分将讨论,Java提供多个内 置的与可能产生的不同种类运行时错误相匹配的异常类型。 堆栈轨迹将显示导致错误产生的方法调用序列。例如,下面是前面程序的另一个版本, 它介绍了相同的错误,但是错误是在main( )方法之外的另一个方法中产生的:
保密申明:秘密级 class HandleError { public static void main(String args[]) { int a=0, b=0, c=0; Random r = new Random(); for(int i=0; i<32000; i++) { try { b = r.nextInt(); c = r.nextInt(); a = 12345 / (b/c); } catch (ArithmeticException e) { System.out.println("Division by zero."); a = 0; // set a to zero and continue } System.out.println("a: " + a); } } }
try { // block of code to monitor for errors } catch (ExceptionType1 exOb) { // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) { // exception handler for ExceptionType2 } // ... finally { // block of code to be executed before try block ends }
当Java运行时系统检查到被零除的情况,它构造一个新的异常对象然后引发该异常。这 导致Exc0的执行停止,因为一旦一个异常被引发,它必须被一个异常处理程序捕获并且被 立即处理。该例中,我们没有提供任何我们自己的异常处理程序,所以异常被Java运行时系 统的默认处理程序捕获。任何不是被你程序捕获的异常最终都会被系统默认处理程序处理。 默认处理程序显示一个描述异常的字符串,打印异常发生处的堆栈轨迹并且终止程序。 下面是由标准javaJDK运行时解释器执行该程序所产生的输出:
// Handle an exception and move on. import java.util.Random;
Generated by Foxit PDF Creator © Foxit Software For evaluation only.
10.5
使用多重catch 语句
某些情况,由单个代码段可能引起多个异常。处理这种情况,你可以定义两个或更多的 catch子句, 每个子句捕获一种类型的异常。 当异常被引发时, 每一个catch子句被依次检查, 第一个匹配成功异常类型的子句首先执行。 当一个catch语句执行以后, 其他的子句被旁路, 执行从try/catch块以后的代码开始继续。下面的例子设计了两种不同的异常类型:
相关文档
最新文档