异常(例外)处理(Exceptions)(精)

合集下载

Java异常(Exception)处理以及常见异常总结

Java异常(Exception)处理以及常见异常总结

Java异常(Exception)处理以及常见异常总结⽬录前⾔异常简介异常类型总结前⾔很多事件并⾮总是按照⼈们⾃⼰设计意愿顺利发展的,经常出现这样那样的异常情况。

例如:你计划周末郊游,计划从家⾥出发→到达⽬的→游泳→烧烤→回家。

但天有不测风云,当你准备烧烤时候突然天降⼤⾬,只能终⽌郊游提前回家。

“天降⼤⾬”是⼀种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。

计算机程序的编写也需要考虑处理这些异常情况。

异常(exception)是在运⾏程序时产⽣的⼀种异常情况,已经成为了衡量⼀门语⾔是否成熟的标准之⼀。

⽬前的主流编程语⾔java也提供了异常处理机制。

异常简介Java中的异常⼜称为例外,是⼀个在程序执⾏期间发⽣的事件,它中断正在执⾏程序的正常指令流。

为了能够及时有效地处理程序中的运⾏错误,必须使⽤异常类,这可以让程序具有极好的容错性且更加健壮。

在 Java 中⼀个异常的产⽣,主要有如下三种原因:1. Java 内部错误发⽣异常,Java 虚拟机产⽣的异常。

2. 编写的程序代码中的错误所产⽣的异常,例如空指针异常、数组越界异常等。

3. 通过 throw 语句⼿动⽣成的异常,⼀般⽤来告知该⽅法的调⽤者⼀些必要信息。

Java 通过⾯向对象的⽅法来处理异常。

在⼀个⽅法的运⾏过程中,如果发⽣了异常,则这个⽅法会产⽣代表该异常的⼀个对象,并把它交给运⾏时的系统,运⾏时系统寻找相应的代码来处理这⼀异常。

我们把⽣成异常对象,并把它提交给运⾏时系统的过程称为拋出(throw)异常。

运⾏时系统在⽅法的调⽤栈中查找,直到找到能够处理该类型异常的对象,这⼀个过程称为捕获(catch)异常。

例 1为了更好地理解什么是异常,下⾯来看⼀段⾮常简单的 Java 程序。

下⾯的⽰例代码实现了允许⽤户输⼊ 1~3 以内的整数,其他情况提⽰输⼊错误。

package io.renren.config;import java.util.Scanner;/*** Created by LiYangYong*/public class TestException {public static void main(String[] args) {System.out.println("请输⼊您的选择:(1~3 之间的整数)");Scanner input = new Scanner(System.in);int num = input.nextInt();switch (num) {case 1:System.out.println("one");break;case 2:System.out.println("two");break;case 3:System.out.println("three");break;default:System.out.println("error");break;}}}正常情况下,⽤户会按照系统的提⽰输⼊ 1~3 之间的数字。

java异常处理方法及流程

java异常处理方法及流程

java异常处理方法及流程Java 异常处理方法及在 Java 编程中,异常处理是一项非常重要的技术。

通过适当的异常处理方法,可以使程序具备更好的稳定性和可读性,提高程序的健壮性。

本文将详细介绍 Java 异常处理的各个流程。

异常的基本概念异常是在程序执行期间产生的一种错误或异常情况。

Java 引入了异常处理机制来处理这些异常,以提高程序的可靠性和可维护性。

异常分为两种类型:1.受检异常(Checked Exceptions):受检异常在编译阶段必须进行处理,否则编译器将报错。

例如,IOException 是常见的受检异常。

2.非受检异常(Unchecked Exceptions):非受检异常是指不需要显式捕获或声明抛出的异常,编译器不会检查是否对其进行处理。

例如,NullPointerException 是常见的非受检异常。

异常处理的方法Java 提供了多种处理异常的方法,包括捕获异常和抛出异常。

下面分别进行介绍。

捕获异常是指通过使用try-catch语句块来捕获并处理异常。

try语句块用于包裹可能出现异常的代码,catch语句块用于捕获并处理异常。

try {// 可能抛出异常的代码块// ...} catch (ExceptionType1 e1) {// 处理异常类型1// ...} catch (ExceptionType2 e2) {// 处理异常类型2// ...} finally {// 可选的 finally 代码块,始终会被执行// ...}抛出异常当一个方法无法处理某个异常时,可以通过throw关键字手动抛出异常。

异常将会被传递给调用该方法的代码,并进一步处理。

public void someMethod() throws SomeException {if (someCondition) {throw new SomeException("Some error message");}使用异常的注意事项在使用异常处理时,需要注意以下几点:•捕获异常的顺序非常重要,应该从特定异常到一般异常的顺序进行捕获。

Linux 的异常处理

Linux 的异常处理
Linux 由此进入正常的运行状态,之后一段程序(用户空间的或者内核空间的)将一直 在 CPU 上执行,直到程序执行结束或发生任何 Exception。发生 Exception 时,CPU 自动进入 内核态(ARM 的 SVC 态),根据发生的 Exception 类型的不同,linux 内核将可能处理外设 IO、 切换进程、管理内存分配、提供系统服务等一系列操作。所以 Linux 的动态运行可以认为完 全是由 Exception 事件驱动的。
.endm
name:要生成的 vector_xxx 中的 xxx,比如 vector_stub irq, IRQ_MODE, 4,生成 vector_irq, 即 Exception 向量中 IRQ 对应的跳转地址。
mode:设定 CPU 模式位(CPSR 的 M[4:0]),从而可以操作对应模式的特殊寄存器。
图中显示,所有 7 种类型的 Exception 的跳转地址按顺序从基地址开始排列,被称
为 Exception 向 量 。 ARMv6 支 持 两 种 基 地 址 ( Normal:0x00000000,High vector:0xFFFF0000),具体使用哪个基地址,由 ARMv6 内部的 Control Register 的 bit13(V bit)设定。Linux 使用 High vector,需要注意的是,Exception 向量地址也是 虚拟地址(如果使用了虚拟地址机制)。
bl trace_hardirqs_off
#endif
get_thread_info tsk
#ifdef CONFIG_PREEMPT
ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
add r7, r8, #1

Exception的异常分类与处理

Exception的异常分类与处理

Exception的异常分类与处理⼀、异常:1:错误的分类1)Error:错误(不可控),⼀般指的是系统⽅⾯的异常,⽐如蓝屏,内存溢出,jvm运⾏环境出现了问题。

2) Exception:是可控的异常,程序员可以在编写程序时解决的错误。

3)两者的⽗类为Throwable;2:可以控制的异常:Exception:是所有异常的⽗类,其下⾯可以派⽣出很多⼦类型。

3:异常处理机制。

在编写程序时,某⼀块代码可能会某些异常。

我们应该对这块1)进⾏异常处理。

怎么处理呢?如下语法:--解决⽅法try{捕捉代码⽚段出现的异常信息,然后封装成异常对象//可能出现异常的代码块放⼊try{}中,}catch(异常类型的声明--引⽤捕捉到的异常对象){//处理异常}finally{/*不管try中是否出现异常,都会执⾏此部分代码。

⼀般都⽤来⽤做关闭,释放等操作。

try中出现return 也会执⾏finally中的语句*/}2)进⾏处理过程:我们将可能出现异常的代码块放⼊try{}中,①jvm会进⾏检查try{}中的代码,如果有异常,jvm就会将异常信息封装成相应的异常对象,然后转移到catch(){}代码块中进⾏处理,执⾏{}中的业务逻辑。

最后会执⾏finally模块的代码。

②如果try{}中没有异常出现,最后也会执⾏finally模块中的逻辑。

4:catch代码块:①数量上:可以有1个或多个,②执⾏顺序:从上到下的catch块使⽤的异常类型可以是同级别的;如果多个异常类型有⽗⼦关系时,那么应该先写⼦异常,再写⽗异常。

(先写⽗异常时,编译不通过)先处理⼦类型异常,再处理⽗类型异常。

5:finally代码块:①finally代码块是有没有异常都会执⾏的,最后执⾏。

②通常⽤于关闭某些操作,删除临时⽂件等;③不管try有没有异常当程序中有return关键字的时候,先执⾏return,再执⾏finally代码块6:throw : 抛出异常对象。

异常处理总结

异常处理总结

异常处理1、为什么要引入异常处理机制我们的程序在编译或运行时可能会出问题,当出现问题的时候程序就死掉了,这样的程序健壮性不好。

因此在JAVA中我们引入了异常处理机制,既保证能及时发现问题并加以纠正,又能保证程序不死掉。

JAVA中保证程序健壮性的方式有三种:垃圾回收机制(保证不会发生内存泄露)弃用指针(保证不能直接对底层进行操作)异常处理机制(保证程序不会因发生异常而死掉)2、什么是异常处理机制2.1、异常的定义程序问题的分类:错误(Error):严重的错误,无法通过修改代码来处理。

如JVM运行失败、线程池出错导致JVM无法正确运行。

异常(Exception):异常表示程序执行过程中出现的不正常的现象,可以通过修改代码来进行弥补。

⏹ 异常的分类:◆ 运行时异常(unchecked):运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。

这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

◆ 编译时异常(checked):编译时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。

从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。

如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

⏹ 异常处理的顺序:◆ 引发异常(检测异常情况并生成异常的过程叫引发异常)◆ 捕获异常(当异常被引发时,可被处理程序捕获)◆ 处理异常(上面的两个过程总称为处理异常)2.2、异常的捕获和处理机制Java异常处理涉及到五个关键字,分别是:try、catch、finally、throw、throws 一个异常处理块的通常语法形式:Try{//可能引发异常的语句}Catch(ExceptionType1 ex){//获得此类异常信息并处理异常的代码}Catch(ExceptionType2 ex){//获得此类异常信息并处理异常的代码}(注意:Catch块的放置顺序,捕获子类异常放前面,捕获父类异常放后面)…………Finally{//一般为释放资源的语句}⏹ 以上语法有三个代码块:try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。

异常处理基本流程七步

异常处理基本流程七步

异常处理基本流程七步第一步:捕获异常异常处理的第一步是捕获异常。

当我们预料到某一段代码可能会抛出异常时,我们可以使用try语句来捕获这个异常。

在try语句中的代码块中执行可能会出现异常的代码,一旦抛出异常,会跳转到except语句块中进行处理。

第二步:处理异常在except语句块中,我们可以对捕获到的异常进行处理。

我们可以根据不同的异常类型,进行相应的处理。

比如可以输出异常信息、记录日志、返回特定的值等。

在处理异常的过程中,我们可以选择让程序继续执行或者终止程序。

第三步:抛出异常有时候,在处理异常时,我们可能并不知道如何处理这个异常,或者希望让调用者来处理这个异常。

这时候可以使用raise语句来手动抛出异常。

通过raise语句,我们可以显示地抛出异常,并将异常传递给调用者。

第四步:清理操作在异常处理之后,我们有时候需要进行一些清理操作。

比如关闭文件、释放资源、恢复状态等。

为了确保程序的稳定性,我们应该在finally语句块中执行这些清理操作。

finally语句块中的代码会在try语句块中的代码执行完毕之后无论是否发生异常都会执行。

第五步:自定义异常除了使用系统定义的异常类型外,我们还可以自定义异常类型。

通过自定义异常类型,我们可以更好地组织和管理异常情况。

通常我们可以通过定义一个类,并继承自Exception类来创建自定义异常类型。

在程序中抛出自定义异常,可以使代码更加条理清晰。

第六步:异常链在进行异常处理时,有时候一个异常会引发另一个异常,这种情况称为异常链。

为了更好地处理异常链,我们可以使用raise语句来将一个异常传递给另一个异常。

通过这种方式,可以很容易地追踪异常的传递过程,更好地定位问题所在。

第七步:记录日志在程序中良好的记录日志是非常有必要的。

通过记录日志,我们可以更好地追踪程序运行的过程,了解程序中可能存在的异常情况。

在异常处理时,输出异常信息到日志中,可以帮助我们更好地定位、分析问题,并进行及时的处理。

exception用法

exception用法

exception用法什么是exception?在计算机编程中,exception(异常)是指在程序运行过程中出现的错误或异常情况。

当程序执行到某个地方时,如果遇到了错误或者无法正常处理的情况,就会抛出一个异常。

异常可以是由程序员主动触发,也可以是由系统自动触发。

为什么要使用exception?异常处理机制是现代编程语言中的一个重要特性,其目的是提高程序的稳定性和可靠性。

通过使用异常处理机制,可以在程序出现错误时,及时捕获并处理异常情况,避免程序崩溃或产生未知结果。

通过合理地使用异常,可以提高代码的可读性和可维护性,使程序更加健壮和可靠。

如何使用exception?在编程中,使用异常需要遵循一定的规范和步骤。

首先,需要明确应该捕获哪些异常。

通常情况下,应该捕获那些可能导致程序出错或无法正常处理的异常,例如除零异常、空指针异常等。

接下来,需要在可能发生异常的地方添加异常处理的代码。

可以使用try-catch语句来捕获异常。

在try 块中,编写可能会产生异常的代码,而在catch块中,根据需要进行异常处理的代码。

当try块中的代码出现异常时,程序会跳转到对应的catch 块继续执行异常处理的代码。

此外,还可以使用finally块,该块中的代码不论是否发生异常都会执行。

finally块通常用于释放资源或进行清理操作。

除了try-catch-finally语句,还可以使用throw语句来主动抛出异常。

当程序中的某个条件不满足时,可以使用throw语句抛出一个异常对象。

throw语句将异常对象传递给调用者,然后由调用者决定如何处理该异常。

在处理异常时,应该根据具体情况进行合适的异常处理。

可以选择捕获异常后直接处理,也可以选择包装异常后再抛出。

包装异常通常用于在不损失异常信息的情况下将异常传递给上层调用者。

此外,在进行异常处理时,应该遵循“避免过早优化”的原则,尽量不要过度使用异常处理语句,以免降低代码的可读性和性能。

异常处理策略及优先级

异常处理策略及优先级

异常处理策略及优先级在软件开发和系统运维中,异常处理是非常重要且必不可少的一部分。

异常处理策略可以帮助我们更好地发现、记录和解决潜在的问题,从而保证系统的可靠性和稳定性。

本文将介绍异常处理策略的一般原则和优先级的制定。

1. 异常处理策略原则异常处理策略的制定应遵循以下原则:1.1 及时发现和记录异常当系统发生异常时,应该及时发现并将其记录下来,以便后续分析和处理。

在代码中,可通过try-catch语句捕获并处理异常,然后将错误信息记录到日志文件中。

1.2 提供友好的用户体验当系统出现异常时,应向用户提供友好的错误提示信息,让用户能够理解问题所在并采取适当的措施。

用户友好的错误提示信息可以提高用户满意度,减少用户投诉。

1.3 适当的异常处理方式对于不同类型的异常,应采取适当的处理方式。

有些异常可以被修复,可以尝试重新执行操作;而有些异常可能无法修复,应向上层报告并终止相应的操作。

异常处理方式的选择需要根据具体情况来决定。

2. 异常处理优先级在制定异常处理策略时,需要明确异常的优先级,以便根据优先级进行适当的处理。

2.1 致命异常(Critical)致命异常是指会导致系统崩溃或无法正常运行的异常,需要立即进行处理。

当系统发生致命异常时,应向管理员发送警报并尽快采取紧急措施,以避免系统持续受损。

2.2 严重异常(Major)严重异常是指会导致系统部分功能无法正常运行的异常,需要尽快进行处理。

这些异常可能会导致用户无法完成某些操作,影响用户体验或业务流程。

应立即通知开发人员或系统管理员,并尽快修复问题,使系统恢复正常。

2.3 一般异常(Minor)一般异常是指对系统功能没有明显影响或影响较小的异常,不会打断系统的正常运行。

这些异常可以通过日志记录并定期进行分析,以便在后续版本中进行修复和改进。

2.4 警告信息(Warning)警告信息是指可能会导致潜在问题的异常。

当出现警告信息时,应该进行监控和分析,并采取预防措施,以避免问题进一步恶化。

什么是异常

什么是异常

什么是异常?异常(Exception)是在程序运行期间发生的错误或意外情况。

它表示程序执行过程中的异常事件,可能导致程序无法正常继续执行。

异常提供了一种机制来处理错误情况,并采取相应的措施以避免程序崩溃或产生不可预料的结果。

异常的主要特点如下:1. 异常类型:异常可以分为两种类型:已检查异常(Checked Exception)和运行时异常(Runtime Exception)。

已检查异常是在编译时强制要求处理的异常,必须使用try-catch语句或在方法签名中声明抛出异常。

运行时异常是不需要强制处理的异常,可以选择处理或不处理。

2. 异常类层次结构:异常类以层次结构的形式组织,形成异常类的继承关系。

根异常类是Throwable类,它派生出两个子类:Error和Exception。

Error表示严重的系统问题,一般无法处理,例如内存溢出。

Exception表示程序运行期间的异常情况,可以通过异常处理机制进行处理。

3. 异常处理机制:异常处理是通过使用try-catch语句块来捕获和处理异常。

try块中包含可能抛出异常的代码,catch块用于捕获和处理异常。

当try块中的代码抛出异常时,程序执行将跳转到匹配的catch块,执行catch块中的代码。

如果没有合适的catch块来处理异常,异常将被传递给调用者,一直传递到顶层(main方法)或被JVM处理。

4. 异常处理机制的执行流程:当异常发生时,程序执行将从当前的代码块跳转到最近的匹配的catch块。

如果找不到匹配的catch块,则执行流程将终止,并且异常会传递到调用者。

如果在catch块中处理了异常,程序将继续执行catch块之后的代码。

5. 异常处理的多个catch块:一个try块可以有多个catch块,用于处理不同类型的异常。

catch块按照从上到下的顺序进行匹配,只有第一个匹配的catch块会被执行。

因此,应该将特定的异常类型的catch块放在前面,将通用的异常类型的catch块放在后面。

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中,异常分为可检查异常(checked exception)和不可检查异常(unchecked exception)。

可检查异常是指在编译时必须进行捕获处理的异常,如IOException、SQLException等;不可检查异常是指在编译时不需要进行捕获处理的异常,如NullPointerException、ArrayIndexOutOfBoundsException等。

(二)异常处理程序异常处理程序是在出现异常时执行的代码块,可以对异常进行捕获、处理和恢复。

以下是常用的异常处理程序:1. try-catch语句:通过try块来执行可能发生异常的代码,如果出现异常,则会执行catch块中的代码来处理异常。

2. finally语句:无论是否出现异常,finally块中的代码总会被执行。

通常用于资源的释放或清理操作。

3. try-with-resources语句:用于自动关闭实现了AutoCloseable 接口的资源,比如文件、数据库连接等。

try块结束后,会自动关闭相关资源,无需显式调用close(方法。

4. throw语句:用于手动抛出异常,可以在方法中或代码块中使用throw语句来抛出自定义异常。

(三)异常处理方法1. 捕获异常:通过try-catch语句来捕获异常,避免程序终止运行。

在try块中执行可能抛出异常的代码,如果出现异常,就会被catch块捕获并处理。

2. 抛出异常:当无法处理异常时,可以使用throw语句手动抛出异常,将异常传递给上层调用者或JVM来处理。

在方法内部使用throw语句抛出的异常,需要在方法声明中使用throws关键字声明。

3. 异常链:如果在捕获异常时希望保留原始异常的信息,可以使用异常链来将当前异常与原始异常相关联。

可以通过在catch块中使用throw语句将当前异常封装成新的异常,并将原始异常作为参数传递给新的异常。

exception的用法

exception的用法

exception的用法异常(Exception)是在程序运行过程中发生的错误或异常情况。

在编程中使用异常处理机制可以使程序具备更好的容错性和可靠性。

本文将围绕异常的用法展开,包括异常的定义、异常的分类、异常处理的基本语法以及异常处理的最佳实践等方面进行一步一步的回答。

一、异常的定义异常是指在程序运行过程中发生的错误或异常情况。

它可能是由于程序逻辑的错误、外部环境的变化或用户输入的不合法等原因引起的。

例如,当除数为零时,产生一个除以零的异常。

二、异常的分类在Java中,异常被分为两类:检查异常(Checked Exception)和非检查异常(Unchecked Exception)。

检查异常是指在编译时就需要处理的异常,必须显式地进行捕获或声明抛出。

非检查异常则是在运行时才会被检测到的异常,可以选择是否进行处理。

1. 检查异常检查异常是Exception类及其子类的实例。

它们通常是预料到的、需要处理的异常情况。

如果不处理这些异常,程序将无法通过编译。

2. 非检查异常非检查异常是RuntimeException类及其子类的实例。

它们通常是由程序代码的错误引起的,如空指针异常(NullPointerException)或数组下标越界异常(ArrayIndexOutOfBoundsException)。

这类异常在编译时不需要进行强制处理,但在运行时会导致程序异常终止。

三、异常处理的基本语法异常处理是通过使用try-catch语句块来实现的。

基本语法如下:try {可能会引发异常的代码块} catch (ExceptionType1 e1) {处理ExceptionType1类型的异常} catch (ExceptionType2 e2) {处理ExceptionType2类型的异常} finally {可选的finally块,无论是否发生异常都会被执行}在try块中,我们编写可能会引发异常的代码。

如果发生异常,程序将跳转到对应的catch块,并进行相应的异常处理。

异常处理的两种方式

异常处理的两种方式

异常处理的两种⽅式⼀、使⽤throws关键字,声明异常,交给⽅法的调⽤者处理,最终交个JVM处理(中断处理)JVM中断处理,后⾯的后续代码就不会执⾏了。

throws使⽤格式:当⼀个⽅法抛出了异常,就在⽅法声明时使⽤throws关键字,将异常交给⽅法调⽤者处理修饰符返回值类型⽅法名(参数列表) throws AAAException, BBBException {//method body}注意:1、如果throws的多个异常是⼦⽗类关系,那么就只⽤声明⽗类2、调⽤了声明异常的⽅法,那么就必须处理这些声明的异常,要么是继续throws,交给别⼈处理,要么就try...catch⾃⼰处理package cn.zhuobo.day12.aboutException;import java.io.FileNotFoundException;import java.io.IOException;public class Demo01Throws {public static void main(String[] args) throws IOException {// main调⽤了声明异常的⽅法,可以选择继续声明异常,继续抛出异常给main的调⽤者也就是JVM处理 readFile("c:a.taxt");}// 这是这三个异常的继承关系:FileNotFoundException extends IOExcetion Exception,因此抛出了两个异常就只⽤声明⽗类异常public static void readFile(String fileName) throws IOException {if(!fileName.equals("c:a.txt")) {throw new FileNotFoundException("⽂件路径不是c:a.txt");}if(!fileName.endsWith(".txt")) {throw new IOException("后缀名不是txt");}System.out.println("读取⽂件");// 如果不符合抛出异常的条件,那么就执⾏这句话}}⼆、异常的第⼆种处理⽅式,捕获异常try......catch格式:try {可能产⽣异常的代码}catch(定义⼀个异常的变量,⽤来接收try中抛出的异常对象) {异常的处理逻辑,接收异常对象之后怎么处理异常,⼀般在⼯作中会把异常记录到⼀个⽇志中}...// 多个catchcatch(异常类名变量名) {try可能抛出多个异常,可以使⽤多个catch}finally {System.out.println("这⾥的代码⽆论是否出现异常都会执⾏,⼀般⽤于资源回收");// finally代码块不能单独使⽤,和try catch⼀起使⽤// 如果finally代码块⾥有return语句,那么永远返回finally中的结果,应该避免在finally中写return语句}后续代码注意:1、try可能回抛出多个异常对象,可以使⽤多个catch处理这些异常2、try产⽣了异常就执⾏相对应的异常处理逻辑,之后继续执⾏后续代码3、没有产⽣异常就不执⾏catch,执⾏完try后,执⾏后续代码package cn.zhuobo.day12.aboutException;import java.io.FileNotFoundException;import java.io.IOException;public class Demo02TryCatch {public static void main(String[] args) {//这⾥没有throws声明抛出异常try {// 可能产⽣异常的代码readFile("sss");}catch (IOException e) {// try⾥抛出什么异常对象,catch就声明什么异常变量,接收抛出的异常// 异常的处理逻辑System.out.println("后缀名不是txt");}//与throws不同的是,⾃⼰try catch处理异常,不是交个⽅法调⽤这JVM处理,就不会中断处理,后续代码可以继续执⾏System.out.println("这些都是后续的代码");}public static void readFile(String fileName) throws IOException {// 如果结尾不是txt,这个⽅法会产⽣⼀个异常对象 if(!fileName.endsWith(".txt")) {throw new IOException("后缀名不是txt");}}}三、Throwable类中定义了三个异常处理⽅法String getMessage():返回此 Throwable 的简短描述String toString():返回此 Throwable 的详细消息字符串void printStackTrace():JVM打印异常对象,默认使⽤这个⽅法,这是最详细的异常信息// 可以在catch使⽤这三个⽅法,打印异常信息catch (IOException e) {// try⾥抛出什么异常对象,catch就声明什么异常变量,接收抛出的异常// 异常的处理逻辑System.out.println(e.getMessage());System.out.println(e.toString());e.printStackTrace();}Output:异常信息⼀个⽐⼀个详细后缀名不是txt// getMessagejava.io.IOException: 后缀名不是txt// toStringjava.io.IOException: 后缀名不是txt// printStackTraceat cn.zhuobo.day12.aboutException.Demo02TryCatch.readFile(Demo02TryCatch.java:23)at cn.zhuobo.day12.aboutException.Demo02TryCatch.main(Demo02TryCatch.java:10)。

[Base]exception异常处理

[Base]exception异常处理

[Base]exception异常处理A、引⾔A.1、关键字Exception异常、例外。

注意是异常不是错误error。

Throw掷,抛。

⽤于产⽣⼀个例外,或者说掷出⼀个例外。

Try catch finally尝试 抓住最后。

try{}catch{}⽤于对某程序块如果发⽣异常时进⾏处理。

Finally最后处理。

Throws是检查⽅法中的可能抛出的 "未检查 "异常。

A.2、使⽤说明Throws是在定义⽅法时,预先设定的⽅法中可能抛出的异常。

多写在⽅法定义的后⾯。

在该⽅法中只抛出异常但该不进⾏处理。

在写了throws的⽅法中可以不⽤去处理异常,但是在调⽤⽅法中,⾄少有⼀级是处理这种异常的。

try{}catch{}是在try程序块中捕捉可能出现的异常并在catch块中处理。

try{}catch{}finally{}try{}表⽰该⼤括号名括的语句有可能抛出异常,如果捕捉到的异常,则由catch(...)进⾏识别并处理catch(){}识别try抛出的异常并进⾏处理finally(){}有⽆异常均会执⾏这⾥的语句,⽤于释放异常情况下未释放的资源操作等Throw是在程序体运⾏过程中⼀定的条件下抛出⾃定义或java定义的异常。

B、例⼦说明B.1、情形⼀void a() throws Exception{System.out.println(1/0);}//⽅法a预定可能抛出的异常Exception。

void b(){try{a();}catch(Exception e){//打印异常的堆栈信息e.printStackTrace();//处理异常的或者再次抛出throw e;}}//⽅法b处理⽅法a抛出的异常,并再次抛出。

因为⽅法a为对异常进⾏处理,则⽅法b要么对异常进⾏处理,要么在⽅法中再次throws异常。

void c(){try {b();}catch(Exception e){//如果在b()中再次抛出异常,可以在这⾥处理异常}}//若⽅法b未再次抛出异常。

异常处理流程数据表结构设计

异常处理流程数据表结构设计

异常处理流程数据表结构设计引言:在软件开发过程中,异常处理是一个非常重要的环节。

当程序运行过程中遇到异常情况时,需要进行相应的处理,以保证程序的稳定性和可靠性。

为了规范异常处理流程,可以设计一张异常处理流程数据表,用于记录异常的类型、处理方式等信息。

本文将详细介绍异常处理流程数据表的结构设计。

一、异常处理流程数据表的基本信息异常处理流程数据表是一个包含多个字段的表格,用于记录异常处理的相关信息。

下面是异常处理流程数据表的基本字段:1. 异常类型(ExceptionType):用于描述异常的类型,如空指针异常、文件读取异常等。

2. 异常描述(ExceptionDescription):对异常进行详细的描述,包括异常产生的原因、影响以及可能的解决方案等。

3. 异常处理方式(HandlingMethod):记录对异常的处理方式,如捕获并记录日志、抛出异常等。

4. 异常处理代码示例(CodeExample):提供异常处理的代码示例,便于开发人员参考和使用。

5. 异常处理结果(HandlingResult):记录异常处理的结果,如成功处理、处理失败等。

6. 异常处理时间(HandlingTime):记录异常处理的时间,便于追溯和统计。

7. 异常处理人员(Handler):记录负责处理异常的人员信息,便于沟通和协作。

8. 异常处理备注(Remark):可选字段,用于记录其他与异常处理相关的信息。

二、异常处理流程数据表的设计思路异常处理流程数据表的设计需要考虑以下几个方面:1. 异常分类:根据实际需求,将异常进行分类,以便更好地管理和处理。

可以按照异常的来源、影响范围等进行分类。

2. 异常描述:对每个异常进行详细的描述,包括异常的原因、产生的条件、可能的解决方案等。

描述要准确清晰,避免歧义或错误信息。

3. 异常处理方式:根据异常的类型和严重程度,确定相应的处理方式。

可以采用捕获并记录日志、抛出异常、重试等方式进行处理。

JAVA-异常处理

JAVA-异常处理

JAVA-异常处理1.异常概述1. 异常是运⾏时错误(程序执⾏期间发⽣的事件).2. 异常是从⽅法抛出的,⽅法的调⽤者可以捕获以及处理该异常.3. 异常处理使得程序可以处理运⾏时的错误并且继续通常的执⾏.4. 运⾏时错误: 程序运⾏过程中,若JVM检测出⼀个不可能执⾏的操作.eg.越界下标访问: ArrayIndexOutOfBoundsException5. 异常: JAVA中运⾏时错误会作为异常抛出. 异常为⼀种对象.⼤致模板:try{Code to run;A statement or a method that may throw an exception;More code to run;}catch(type ex){Code to process the exception;}1. 很多库⽅法都会抛出异常,此时throw可省2. ⼀个异常可能是通过try块中的throw语句直接抛出,或者调⽤⼀个可能会抛出异常的⽅法⽽抛出3. 若try块中内容正常执⾏,不会引起异常4. 若try块中内容(⽅法)遇到⼀个异常,其会抛出⼀个异常给它的调⽤者,这个调⽤者的catch处理该异常拋出(throw)异常:⽣成异常对象,并把它提交给运⾏时系统。

捕获(catch)异常:运⾏时系统在⽅法的调⽤栈中查找,直到找到能够处理该类型异常的对象。

2.异常类型Java通过⾯向对象来处理异常,即异常是对象,⽽对象都⽤类来定义。

异常的根类为ng.Throwable异常类的类型:1. 系统错误Error: Java虚拟机抛出,描述内部系统错误.发⽣时:通知⽤户以及尽量稳妥地终⽌程序.2. 异常Exception:描述由程序和外部环境引起的错误.发⽣时:能被程序捕获和处理1. 运⾏时异常(unchecked): RuntimeException类表⽰,程序设计错误。

如 NullPointerException、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。

第7章__例外处理

第7章__例外处理
用于抛出一个例外 用于声明方法可能抛出的例外类型

throw e;


throws Etype1, Etype2 ……

1、例外的概念
程序中的例外不外乎两种情况:一种是运行环境不能 满足程序运行的要求而出错;一种是程序要解决的问 题的约束而导致的。 不管是哪种情况,编写程序时,程序员要考虑到程序 运行时可能遇到的各种情况(条件),并进行处理; 如果不能处理,或者不知该如何处理,就可以认为是 一种错误,这时,就需要交给别人去处理。 以前,是通过返回错误代码来提示别人程序有错误; 在Java中,则是通过例外机制通知别人出错信息。
1、例外的概念
{
用例外的形式处理错误:
try { openTheFile; determine its size; allocate that much memory; read-File; closeTheFile; } catch(fileopenFailed) catch(sizeDetermineFailed) catch(memoryAllocateFailed) catch(readFailed) catch(fileCloseFailed) finally

Exception:一般程序中可预知的问题,其产生的例外 可能会带来意想不到的结果,因此Java编译器要求Java 程序必须捕获或声明所有的非运行时异常。

2、例外的分类
用户自己产生的例外
Throwable
Exception
处理
Error
不做处理 由用户捕获或 声明并处理 RuntimeException

AWTError (in java.awt) …
2、例外的分类

异常处理的方法及步骤

异常处理的方法及步骤

异常处理的方法及步骤引言:在编程过程中,我们经常会遇到各种各样的异常情况。

为了保证程序的稳定性和可靠性,我们需要对这些异常情况进行处理。

异常处理是指程序在运行过程中遇到错误或异常情况时,能够做出相应的处理措施,以保证程序的正常运行。

本文将介绍异常处理的方法及步骤,帮助读者更好地理解和应用异常处理的技术。

一、异常处理的方法1. try-catch块:try-catch块是最基本的异常处理方法。

它的结构如下:```try {// 可能会产生异常的代码} catch (Exception e) {// 异常处理代码}```在try块中,我们放置可能会产生异常的代码。

当这些代码运行时,如果产生了异常,程序会立即跳转到catch块,并执行catch块中的代码,以处理异常。

catch块中的Exception e是用来接收异常信息的变量,我们可以通过这个变量来获取异常的相关信息,并做出相应的处理。

2. 多个catch块:有时候,我们可能会遇到多种类型的异常,每种异常需要做出不同的处理。

这时,我们可以使用多个catch块来分别处理不同类型的异常,如下所示:```try {// 可能会产生异常的代码} catch (ExceptionType1 e1) {// 异常处理代码1} catch (ExceptionType2 e2) {// 异常处理代码2}```在多个catch块中,我们可以根据具体的异常类型来编写不同的处理代码。

当产生异常时,程序会根据异常类型的匹配情况,选择相应的catch块来执行。

3. finally块:有时候,我们希望无论是否发生异常,都能执行一些必要的代码,比如释放资源等。

这时,我们可以使用finally块来实现这个需求,如下所示:```try {// 可能会产生异常的代码} catch (Exception e) {// 异常处理代码} finally {// 必要的代码}```在finally块中的代码,无论是否发生异常,都会被执行。

一般过去时的例外情况 (exceptions)

一般过去时的例外情况 (exceptions)

一般过去时的例外情况 (exceptions)一般过去时的例外情况(Exceptions to the Simple Past Tense)一般过去时(Simple Past Tense)是表示过去发生的动作或状态的一种时态。

但有一些情况下,我们需要使用其他时态来描述过去的事件。

以下是一些一般过去时的例外情况:1. 过去进行时(Past Continuous Tense):当我们想强调过去某个时刻正在进行的动作时,可以使用过去进行时。

例如:I was studying when she called me.(她打电话给我时我正在研究。

)2. 过去完成时(Past Perfect Tense):当我们想表达在过去某个时间点之前已经发生的动作时,可以使用过去完成时。

例如:He had already finished his homework when his friend arrived.(他的朋友到达之前他已经完成了作业。

)3. 过去完成进行时(Past Perfect Continuous Tense):当我们想表达在过去某段时间内一直持续进行的动作,且该动作在过去某个时间点之前开始,可以使用过去完成进行时。

例如:She had been studying for two hours before she took a break.(她休息之前一直在研究已经两个小时了。

)4. 一般现在时(Present Simple Tense):有些动词描述的是普遍真理或惯性的动作,即使发生在过去,我们仍然使用一般现在时来表达。

例如:He said that the sun rises in the east.(他说太阳从东方升起。

)5. 模态动词(Modal Verbs):在描述过去的某些情况下,我们会使用模态动词来表达推测、愿望或建议。

例如:He might have gone to the party last night.(他可能昨晚去了派对。

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 语句用于捕获异常并进行处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java中定义了各种异常
3
Java中定义的异常类
Java中定义了各种异常类。ng.Throwable 是这些类的父类。 VirtualMachineError Error AWTError
ArithmeticException
NullPointerException IndexOutOfBoundsException EOFException
Hello! HELLO WORLD ! ! ng.ArrayIndexOutOfBoundsException at HelloWorld.main(HelloWorld.java:7)
2
Exception 的概念
Exception 是在程序运行时打断正常程序流程的 异常的情况 •试图打开的文件不存在 •网络链接中断 •操作数越界 •要加载的类文件不存在
10
//本例演示异常的父子类关系,注意父类异常的catch语句应该应该 //放在其子类异常catch语句的后面,否则,其子类异常永远不会被捕获。 public class TestException4 { public static void main(String [] args) { try { int a1=Integer.parseInt(args[0]); int a2=Integer.parseInt(args[1]); int result=a1/a2; System.out.println("The result is " + result); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("下标越界:"+e.getMessage()); } catch(ArithmeticException e) { System.out.println("除数为零:"+e.getMessage()); } catch(Exception e) //若Exception的子类被捕获,则Exception不再会被捕获 { System.out.println("捕获了异常:"+e.getMessage()); } finally { System.out.println("进入Finally语句块"); } } }
14
自定义异常
我们可以自己定义异常类,自定义异常类是Exception类 的子类,可包含普通类的内容。 例:
class DivideByMinusException extends Exception{ int divisor; public DivideByMinusException (String msg, int divisor){ super(msg); this.divisor = divisor; } public int getDivisor(){ return divisor; } }
பைடு நூலகம்
5
异常处理
异常处理的两种方式
扑获并处理异常
将方法中产生的异常抛出
6
示例:TestException
1. public class TestException 运行结果: Exception in thread "main" ng.ArithmeticException: / by zero 2. { at Test.devide(TestException.java:13) 3. public static void main(String [] args) at TestException.main(TestException.java:5) 4. { 5. int result=new Test().devide(3,0); 6. System.out.println(“The result is “ + result); 7. } 8. } 9. class Test 10. { 11. public int devide(int x, int y) 12. { 13. return x/y; 14. } 15. }
16
捕获异常并处理
public class TestDefineException { public static void main(String [] args) { try { int result=new Test().devide(3,0); System.out.println("The result is " + result); } catch(DivideByMinusException e) { System.out.println("除数为负:"+e.getMessage()); e.printStackTrace(); } catch(ArithmeticException e) { System.out.println("捕获了异常:"+e.getMessage()); } } }
8
可能发生异常的java语句块 } catch(ExceptionType1 eVariableName1) { 处理相应异常的java语句块 } catch(ExceptionType2 eVariableName2) { 处理相应异常的java语句块 } ... [ finally { 语句块 }]
Throwable
RuntimeException
Exception
IOException
FileNotFoundException
4
Error 很难恢复的严重错误,一般不由程序处理。
RuntimeException 程序设计或实现上的问题,如数组越界等。
其它例外 通常是由环境因素引起的,并且可以被处理的。 如文件不存在,无效URL等。
通用异常处理示 例
11
异常处理方式之二: 抛出异常
将方法可能产生的异常抛出,表明该方法将不处理该异 常,调用该方法的程序将负责处理异常,或则再将异常抛 出。(类似于将麻烦传给上级) 例:public void troublesome( ) throws IOException{ ….. }
如果一个例外在返回到main()(国务院)时还未被处理, 则程序将非正常终止。
多种异常的通用处理
9
异常处理可以针对这个体系中的任意一个类。
•叶结点:是具体、专用的异常处理; •中间结点:是通用的异常处理处理。可以处理 该结点及其子类类型的异常。
例: try { ... } catch (Exception e) { System.err.println("Exception caught: " + e.getMessage()); }
7
异常处理方式之一: 扑获并处理异常
try…catch语句
try {
异常处理举例
try 语句块后必须至少 跟一个catch语句块。 当try语句块中发生的异 常与catch语句的异常类 型匹配,控制转到相应 的catch语句中。 无论是否发生异常, finally语句块都会被执 行。 try, catch, finally之间不 能插入其他语句。
13
抛出异常
抛出异常使用throw语句,格式如下: throw someThrowableObject
例: public Object pop() throws EmptyStackException { Object obj; if (size == 0) throw new EmptyStackException(); obj = objectAt(size - 1); setObjectAt(size - 1, null); size--; return obj; }
18
17
作业
P169 4,5
自定义一个异常,叫做负年龄异常: MinusAgeException。类Person有姓名name,年 龄age等属性,在Person类的构造方法中,若年 龄为负,则抛出MinusAgeException异常。请编写 MinusAgeException ,Person和相应的测试类。
15
抛出产生的异常
class Test { public int devide(int x, int y) throws DivideByMinusException { if (y<0) throw new DivideByMinusException("除数也不能为负数哦!",y); int result= x/y; System.out.println("in devide!"); return result; } }
第9讲 异常(例外)处理(Exceptions)
Exceptions的概念
例外处理
自定义例外
1
引例
1 2 3 4 5 6 7 8 9 10 11 Public class HelloWorld{ public static void main(String args[ ]){ int i=0; String greetings[ ]={ “Hello World!”,”Hello!”, “HELLO WORLD!!”}; while ( i<4){ System.out.println(greetings[i]); i++; } } } Hello World!
12
抛出异常示例
//本例演示抛出异常。一段调用抛出了异常的方法的程序,必须对异常进行处理 //或者再将异常抛出,否则不能通过编译。 public class TestException5 { public static void main(String [] args) // throws Exception { int result=new Test().devide(3,0); System.out.println("The result is " + result); } } class Test { public int devide(int x, int y) throws Exception { return x/y; } }
相关文档
最新文档