自定义Java异常
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使⽤枚举类实现⾃定义异常记录⼀些⼩知识点: 1、java异常根本⽗类为Throwable, Throwable有两个⼦类:Error和Exception。
2、Exception常见的⼦类有: DataFormatException, IOException, NoSuchFieldException, RuntimeException, SQLException, TimeoutException。
3、RuntimeException常见的⼦类有: BufferOverflowException, ClassCastException, IndexOutOfBoundsException,NullPointerException, SystemException。
4、Error不需要讨论,这些错误是正常编码不会出现或者在程序层⾯⽆法处理的事情。
5、Error和RuntimeException是⾮检查型异常,其他的都是检查型异常。
检查型异常,顾名思义,编辑器会帮助你检查,如果你编码错误,编辑器会报红,如果可能出现此种异常,必须要⽤try-catch包裹住。
运⾏时异常,不需要使⽤try-catch包裹,编码编译可以通过。
6、另说个⼩坑:如果在更新服务器时,忘记了更新某些⽂件导致⽅法找不到的异常,好像是抛出了error的⼀个⼦类,反正exception没有捕获到,⽇志⾥也没有任何体现,很坑。
现在开始编写⾃定义异常 1、枚举类/*** 异常模板,ecode可以作为统⼀的应答码* @author C* @date 2018年12⽉12⽇上午10:10:42*/public enum CExceptionEnums {SERVER_DO_ERROR ("0001","交易处理失败"),SERVER_FTP_DOWN_ERROR ("0002","从ftp下载⽂件失败"),SERVER_ALIYUN_UPLOAD_ERROR ("0003","上传阿⾥云失败"),SERVER_IMG_ERROR ("0004","图⽚错误"),SERVER_DB_ERROR ("0005","数据库错误"),SERVER_OTHER_ERROR ("1099","其他异常");//枚举类如果写⽅法的话,此处需要写分号private String ecode;private String emsg;CExceptionEnums(String ecode, String emsg) {this.ecode = ecode;this.emsg = emsg;}public String getEcode() {return ecode;}public String getEmsg() {return emsg;}public static CExceptionEnums statOf(String ecode) {for (CExceptionEnums state : values())if (state.getEcode().equals(ecode))return state;return null;}} 2、⾃定义异常/*** ⾃定义异常* @author C* @date 2018年12⽉12⽇上午10:09:15*/public class CException extends Exception implements java.io.Serializable {private static final long serialVersionUID = 1L;/** 模版异常private CExceptionEnums exceptionEnums;/** ⾃定义异常信息*/private String errorDetail;/*** 带⾃定义异常信息的构造⽅法* @param exceptionEnums* @param errorDetail*/public CException(CExceptionEnums exceptionEnums,String errorDetail){this.exceptionEnums = exceptionEnums;this.errorDetail = errorDetail;}/*** 模版异常的构造⽅法* @param exceptionEnums*/public CException(CExceptionEnums exceptionEnums){this.exceptionEnums = exceptionEnums;}public CExceptionEnums getExceptionEnums() {return exceptionEnums;}public String getErrorDetail() {return errorDetail;}public void setErrorDetail(String errorDetail) {this.errorDetail = errorDetail;}} 3、使⽤⽅法/**** @author C* @date 2018年12⽉12⽇上午10:11:35*/public class exceptionTest {public static void main(String[] args) {try{//⾃⼰⽅法内部的异常可以统⼀⽤exception捕获,在catch中再抛出CxzException,在上⼀层⽅法⾥⽤CxzException捕获 //⾃定义异常⽤法⽰例if(true){//可以使⽤模版异常throw new CException(CExceptionEnums.SERVER_DO_ERROR);}if(false){//也可以⾃定义msg信息throw new CException(CExceptionEnums.SERVER_DO_ERROR,"⾃定义msg信息");}dbfunc();}catch(CException ex){//捕获⾃定义异常ex.printStackTrace();System.out.println(ex.toString());CExceptionEnums enums = ex.getExceptionEnums();//此处逻辑,若⽆⾃定义信息,则使⽤默认enums中的msg,如有,则使⽤⾃定义异常信息if (null != ex.getErrorDetail()){//如果⾃定义信息不是null,就使⽤⾃定义信息String cmsg = ex.getErrorDetail();}}catch(Exception ex){}}/*** 假设这是个与数据库有关的⽅法* ⽅法内抛异常可以⽤Exception捕获,再抛出CxzException,上级去处理* @throws CException*/private static void dbfunc() throws CException{if(true){throw new Exception("数据库异常信息");}}catch(Exception ex){System.out.println(ex.getMessage());//打印⽇志--异常中可能有数据库表或字段的名字,不对外暴露throw new CException(CExceptionEnums.SERVER_DB_ERROR);//对外不暴露数据库信息,只显⽰模版异常}}} 这样,⾃⼰的项⽬就可以对外有⼀个统⼀的应答码(⽐如你是⼀个对外提供接⼝的程序或者对前台的响应),报错信息也由⾃⼰编写,对外不暴露项⽬的⼀些东西。
java实训:异常(try-catch执行顺序与自定义异常)

java实训:异常(try-catch执⾏顺序与⾃定义异常)关键字:try:执⾏可能产⽣异常的代码catch:捕获异常finally:⽆论是否发⽣异常代码总能执⾏throws:声明⽅法可能要抛出的各种异常throw:⼿动抛出⾃定义异常⽤ try-catch-finally 异常处理:情况⼀(正常运⾏,⽆异常):执⾏try,执⾏finally,执⾏finally块后的语句情况⼆(try中出现异常)执⾏到异常语句时(不执⾏try中异常语句之后的语句),直接跳到catch块,然后执⾏finally,再执⾏finally之后的语句public class Test2 {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.println("请输⼊被除数:");try { // 将开始可能异常的代码放⼊tryint num1 = in.nextInt();System.out.println("接受除数");int num2 = in.nextInt();System.out.println(num1+"/"+num2+"="+num1/num2);//return;//异常块:catch和finally必须⾄少出现⼀个,try块必须有}catch (InputMismatchException e){//try中有匹配的异常,异常后的语句均不执⾏,直接调⽤catch,然后执⾏catch块之后的程序,若有异常但不匹配,不执⾏catch块,程序直接结束 System.out.println("出现错误,被除数和除数必须为整数");//e.printStackTrace();//输出异常堆栈信息,打印错误序列,调⽤过程e.getMessage();//System.exit(1);return;}catch (ArithmeticException e){System.out.println("被除数不可为0");e.printStackTrace();}finally {//⽆论是否发⽣异常,异常是否匹配,都会执⾏finally,若catch调⽤System.exit(1);finally与finally之后语句均不执⾏System.out.println("感谢使⽤");}System.out.println("finally之后语句");特殊情况之try中含有return:a.⽆异常(执⾏顺序):1.return之前的代码2.finally3.return语句4.执⾏完成(不会执⾏return之后语句,也不会执⾏finally块之后的语句)b.有异常(执⾏顺序):1.异常之前与异常代码2.catch语句3.finally块4.finally块之后语句5.执⾏完毕(因为异常直接跳到catch块,所以try中return不会执⾏)特殊情况之catch中含有returna.⽆异常(执⾏顺序):1.执⾏try代码块2.执⾏finally块3.执⾏finally之后的语句4.退出(⽆异常,所以不执⾏catch,直接执⾏finally)b.有异常(执⾏顺序):这⾥有两种情况情况⼀(异常匹配到的代码块中有return):1.执⾏try块(异常语句后的try语句均不执⾏)2.执⾏catch块return之前的语句3.执⾏finally块4.执⾏catch中的return语句5.退出情况⼆(异常匹配到的代码块⽆有return,catch在其他chtch块中)执⾏到异常语句时(不执⾏try中异常语句之后的语句),直接跳到catch块,然后执⾏finally,再执⾏finally之后的语句catch块的执⾏原理:对于异常的捕获,可以有多个catch,对于try发⽣的异常,他会根据发⽣的异常和catch⾥⾯的异常类型进⾏匹配(按照catch块从上往下匹配,但并不会执⾏不匹配的catch块语句),当他匹配到某个catch块时,他就直接进⼊这个catch块内,忽略这个catch块后⾯的所有catch块,所以,⼀般将catch(Exception e)放在最后,catch块承先⼦类后⽗类排列。
自定义全局异常处理器(Java)

⾃定义全局异常处理器(Java)正常业务系统中,当前后端分离时,系统即使有未知异常,也要保证接⼝能返回错误提⽰,也需要根据业务规则制定相应的异常状态码和异常提⽰。
所以需要⼀个全局异常处理器。
相关代码:异常下⾯是 Java 异常继承图:┌───────────┐│ Object │└───────────┘▲│┌───────────┐│ Throwable │└───────────┘▲┌─────────┴─────────┐││┌───────────┐┌───────────┐│ Error ││ Exception │└───────────┘└───────────┘▲▲┌───────┘┌────┴──────────┐│││┌─────────────────┐┌─────────────────┐┌───────────┐│OutOfMemoryError │... │RuntimeException ││IOException│...└─────────────────┘└─────────────────┘└───────────┘▲┌───────────┴─────────────┐││┌─────────────────────┐┌─────────────────────────┐│NullPointerException ││IllegalArgumentException │...└─────────────────────┘└─────────────────────────┘根据编译时是否需要捕获,异常可以分为两类:1、写代码时,编译器规定必须捕获的异常,不捕获将报错;2、(抛出后)不必须捕获的异常,编译器对此类异常不做处理。
必须捕获的异常:Exception 以及 Exception 除去 RuntimeException 的⼦类。
不必须捕获的异常:Error 以及 Error 的⼦类;RuntimeException 以及 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 异常处理题目

狂翔软件自定义异常章节题目一.选择题:1.关于异常的定义,下列描述中最正确的一个是()a)程序编译错误b)程序语法错误c)程序自定义的异常事件d)程序编译或运行中所发生的可预料或不可预料的异常事件,它会引起程序的中断,影响程序的正常运行2.抛出异常时,应该使用下列哪个子句a)thow b)catch c)finally d)throws3.自定义异常类时,可以通过对现列哪一项进行继承()a)Error 类b)Applet类c)Exception类及其子集d)AssertionError类4.当方法产生该方法无法确定该如何处理导演时,应该如何处理a)声明异常B)捕获异常C)抛出异常D)嵌套异常5.对于try和catch子句的排列方式,下列哪一项是正确的a)子类异常在前,父类异常其后b)父类异常在前,子类异常其后c)只能有子类异常d)父类异常和子类异常不能同时出现在同一个try程序段内6.下列java语言的常用异常类中,属于检测异常的是()a)ArithmeticExceptionb)FileNotFoundExceptionc)NullPointerExceptiond)IOException7.下面描述中,错误的一项是()a)一个程序抛出异常,任何其他在运行中的程序都可以捕获b)算术溢出需要进行异常处理c)在方法中监测到错误但不知道如何处理错误时,方法就声明一个异常d)任何没有被程序捕获的异常将最终被默认处理程序处理8.下列描述中,正确的一个是a)内存耗尽不需要进行异常处理b)除数为零需要进行异常处理c)异常处理通常比传统的控制结构流效率更高d)编译器要求必须设计实现优化的异常处理9.下列错误不属于Error的是a)动态链接失败b)虚拟机错误C)线程死锁D)被零除10.下列描述中,错误的一个是()a)异常抛出点后的代码在抛出异常后不再执行b)任何没有被程序捕获的异常将最终被缺省处理程序处理c)异常还可以产生于JA VA虚拟机内部的错误d)一个TRY代码段后只能跟有一个CATCH代码段11.下列描述中不属于java异常处理机制优点的一项是a)把错误处理代码从正常代码中分离出来b)按错误类型和差别分组c)对无法预测的错误的捕获和处理d)能够处理任何类型的错误12.下列方法中哪一个不能用于获取异常信息()a)toString() b) getMessage() c)drawline()d)printStackTrace()13.下列描述中,哪一项不属于finally语句应该招待的功能()a)释放资源b)关闭文件c)分配资源d)关闭数据库14.下列关于抛出异常的描述中,错误的一项是()a)任何从Throwable派生的类都可以用throw语句抛出b)Exception 和Error是Throwable的直接派生类c)异常抛出点后的代码在抛出异常后不再执行d)Exception代表系统严重错误,一般程序不处理这类错误15.一个catch语句段一定总和下列哪一项相联系a)Try语句段b)finally语句段c)throw d)throws二.选择题1.在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异常处理

该程序段将输出: Array Index out of Bounds
22
不正确用法:
将两个catch块的顺序对调: int a[] = new int[10]; try{
for(int i=0;i<=10;i++) a[i]=i;
}catch(Exception e){ System.out.println("There is an exception");
18
结果分析:
例题的除数为0时返回为0的问题,通过 语句if (d!=0 || n[i]==0)得以改进;
该程序分别在不同的层次对两种异常进 行了处理;
异常处理后的程序保持了良好的健壮性, 体现了“带病工作”的能力;
19
异常处理
异常处理器(exception handler)
try t{ry语句块定义了异常处理器的范围 .c.at.ch语句块捕捉try语句块抛出的异常 t}ryc{atch (ArrayIndexOutOfBoundsException e) { // Code that might generate exceptions } caStcyhs(tTeymp.eo1uitd.1p)ri{ntln(e); }//cHaatcnhdl(eIeOxEcxecpetipotnios nofeT)y{pe1 } caStcyhs(tTeymp.eo2uitd.2p)ri{ntln(e); }// Handle exceptions of Type2 } catch(Type3 id3) { // Handle exceptions of Type3 } // etc ...
20
异常处理
catch 语句的顺序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
自定义Java异常
1.前言:
你的程序总有一天会崩溃掉,在崩溃掉的时候我们要知道它在哪,为了什么而崩溃掉,数据的保存或者丢失情况如何等问题。
我们可以通过继承类
ng.Throwable的子类:Exception来设计我们自己的Java异常。
Exception类用于描述程序能够捕获的异常,如ClassNotFoundException。
要注意的是自定义异常类之间也可以有继承关系,同时也需要为自定义异常类设计构造方法,以方便构造自定义异常对象。
2.设计实例分析:
这是个比较完整的自定义异常类的设计,其实是比较模板化的东西。
package playground;
import java.io.*;
public class MyException extends Exception {
private int id; // a unique id
private String classname; // the name of the class
private String method; // the name of the method
private String message; // a detailed message
private MyException previous =
null; // the exception which was caught
private String separator = "\n"; // line separator
public MyException(int id, String classname, String method,
String message, MyException previous) {
this.id = id;
this.classname = classname;
this.method = method;
this.message = message;
this.previous = previous;
}
public String traceBack() {
return traceBack("\n");
}
public String traceBack(String sep) {
this.separator = sep;
int level = 0;
MyException e = this;
String text = line("Calling sequence (top to bottom)");
while (e != null) {
level++;
text += line("--level " + level +
"--------------------------------------");
text += line("Class/Method: " + e.classname + "/" + e.method);
text += line("Id : " + e.id);
text += line("Message : " + e.message);
e = e.previous;
}
return text;
}
private String line(String s) {
return s + separator;
}
}
我们来一个个看看这些东西:
在这个继承了Exception类的自定义异常类中,我们定义了如下变量:id:独立标示符,这个是用来进行标示类中什么地方出现了错误被捕捉到。
classname:捕捉到这个错误的类的名字。
method:捕捉到这个错误的方法的名字。
message:用来描述整个事件的情况。
previous:是MyException得一个实例,若在链表中它是第一个的话,那么它就是null
我们再看看都定义了什么方法:
traceBack():产生一个包含在异常类中存储的数据的一个回溯。
使用newline标示作为分隔符
traceBack(String sep):和上一个其实是相同的东西,使用的分隔符可以自己定义。
line(String s):traceBack使用的一个方法。
步骤一:先扔出第一个异常:
这有两种情况:
a.若程序判断异常的某个地方主动抛出异常,那么你就会主动抛出一个错误,例如:
throw new MyException( 1, "Person", "getSalary",
"Trying to get a salary, but no person was specified",null);
b.在另一个异常出现时抛出该异常,例如:
catch (Exception e) {
throw new MyException(4, "Person", "read", e.toString(), null);
}
要是某一个方法要抛出MyException异常,那么在方法定义的时候形式如下:
public void read() throws MyException . . .
步骤二:接着我们扔出来的异常,例如:
Person p = new Person();
p.setPersonId(id);
try {
p.read();
s += p.getSalary();
}
catch (MyException e) {
throw new MyException(1, "Stats", "getAllSalaries",
"Could not get salary for " + id, e);
}
我们的策略是这样的:将我们可能扔出异常的方法置于我们的监控之下(try{}),然后出了事情我们在处理区(catch{})把这个异常处理,至于处理的方式可以是当场处理,也可以处理不了交予其他地方处理(throw())。
需要注意的是,我们看到最后一个参数e,我们要在每个新的异常处将这个异常加入到异常类的链表中。
步骤三:回溯异常
我们上边设计的这个异常最后得出的一个异常链如下:
Calling sequence (top to bottom)
--level 1--------------------------------------
Class/Method: SalaryServlet/doGet
Id : 7
Message : Trying to get the total salary for employees
--level 2--------------------------------------
Class/Method: Stats/getAllSalaries
Id : 1
Message : Could not get salary for Lincoln
--level 3--------------------------------------
Class/Method: Person/read
Id : 3
Message : java.sql.SQLException: [HANSEN]Invalid object name 'xEMPLOYEE'.
--level 4--------------------------------------
Class/Method: Person/read
Id : 999
Message : SQLException. State/error code: S0002/208
我们可以分析得知在这个场景上,一个servlet被触发了,它调用了getAllSalaries,然后又调用了read方法,在read方法中,出现了一个SQLException。