Java中自定义异常
- 格式:doc
- 大小:27.50 KB
- 文档页数:4
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执⾏顺序与⾃定义异常)关键字: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一段简单的definedexception -回复问题:Java中的自定义异常(Defined Exception)引言:Java是一种面向对象的编程语言,提供了丰富的异常处理机制。
除了Java 中的内置异常类型,开发人员还可以根据实际的需求定义自己的异常。
一、什么是异常?在程序运行中,有些情况是无法正常处理的,这时就会产生异常。
异常是程序在执行过程中出现的问题,例如除以零、访问不存在的数组元素等。
异常可以分为两种类型:已检查异常(Checked Exception)和未检查异常(Unchecked Exception)。
二、为什么需要自定义异常?Java提供了许多内置异常类型,但有时我们需要根据具体的业务需求定义自己的异常类型。
自定义异常可以使得异常处理更加准确和灵活,提高代码的可读性和可维护性。
三、如何定义自己的异常?在Java中,自定义异常可以通过继承Exception类或RuntimeException 类来实现。
一般情况下,如果希望自定义的异常必须显式地捕获或声明抛出,可以继承Exception类;如果希望自定义的异常无需声明抛出,可以继承RuntimeException类。
下面是一个简单的自定义异常的例子:public class MyException extends Exception {public MyException() {super();}public MyException(String message) {super(message);}}在上面的例子中,我们定义了一个名为MyException的自定义异常类,它继承自Exception类。
MyException类提供了两个构造方法:一个无参构造方法和一个带有message参数的构造方法。
通过调用父类的构造方法,可以在抛出异常时传递详细的错误信息。
四、如何使用自定义异常?使用自定义异常的步骤如下:1. 创建自定义异常类:根据实际需求创建一个继承自Exception或RuntimeException的自定义异常类。
⾃定义全局异常处理器(Java)正常业务系统中,当前后端分离时,系统即使有未知异常,也要保证接⼝能返回错误提⽰,也需要根据业务规则制定相应的异常状态码和异常提⽰。
所以需要⼀个全局异常处理器。
相关代码:异常下⾯是 Java 异常继承图:┌───────────┐│ Object │└───────────┘▲│┌───────────┐│ Throwable │└───────────┘▲┌─────────┴─────────┐││┌───────────┐┌───────────┐│ Error ││ Exception │└───────────┘└───────────┘▲▲┌───────┘┌────┴──────────┐│││┌─────────────────┐┌─────────────────┐┌───────────┐│OutOfMemoryError │... │RuntimeException ││IOException│...└─────────────────┘└─────────────────┘└───────────┘▲┌───────────┴─────────────┐││┌─────────────────────┐┌─────────────────────────┐│NullPointerException ││IllegalArgumentException │...└─────────────────────┘└─────────────────────────┘根据编译时是否需要捕获,异常可以分为两类:1、写代码时,编译器规定必须捕获的异常,不捕获将报错;2、(抛出后)不必须捕获的异常,编译器对此类异常不做处理。
必须捕获的异常:Exception 以及 Exception 除去 RuntimeException 的⼦类。
不必须捕获的异常:Error 以及 Error 的⼦类;RuntimeException 以及 RuntimeException 的⼦类。
java的异常处理机制名词解释在Java开发过程中,异常处理机制是一项重要的功能。
它允许我们在程序中正确处理异常情况,使程序能够更加健壮。
本文将围绕Java的异常处理机制展开,逐步分析其中的名词解释。
1. 异常在Java中,异常指的是在程序执行过程中发生的一些错误或不正常的情况。
这些情况可能是由于用户输入的不正确或系统资源不足等原因所导致。
当程序发生异常时,程序流程将会被中断并转入异常处理程序进行处理。
2. 异常分类Java中的异常分为两类:受检异常和非受检异常。
受检异常是在编译期就可以检测到的异常,编译器强制要求程序去处理这些异常。
而非受检异常不需要强制要求程序去处理,通常是由程序逻辑错误引起的。
3. 异常处理器异常处理器是一段特殊的程序,用于捕获并处理异常。
在Java 中,异常处理器通常使用try-catch语句块来实现。
当程序执行到try 语句块时发生异常,程序将转入catch语句块并进行异常处理。
4. 抛出异常当程序执行发生异常时,可以使用throw语句抛出异常。
throw 语句通常包括一个异常对象,用于说明发生的异常类型。
5. 自定义异常在Java中,我们可以自定义异常来处理我们自己的异常情况。
自定义异常需要继承自Exception类或者RuntimeException类。
通过自定义异常,我们可以将一些通用的异常情况封装起来,提高程序的可读性和可维护性。
6. finally块finally块是try-catch语句块的可选部分,用于在无论是否发生异常都要执行的代码。
finally块通常用于释放资源或进行清理操作。
7. try-with-resources语句try-with-resources语句是Java 7中新增的语法,用于自动关闭资源。
这种语句会自动将在try语句块中声明的资源关闭,无需手动关闭。
这在程序中可以简化代码,提高程序的可读性和可维护性。
通过以上分步骤阐述,我们深入了解了Java的异常处理机制,并对其中的名词解释有了更加清晰的认识。
第1篇一、Java基础知识1. 请简述Java语言的特点。
2. 什么是Java虚拟机(JVM)?它有什么作用?3. 什么是Java的内存模型?请解释Java内存模型中的几个关键概念:堆、栈、方法区、程序计数器、本地方法栈。
4. 什么是Java中的反射机制?请举例说明反射在Java中的应用。
5. 什么是Java中的泛型?请解释泛型的原理和作用。
6. 请简述Java中的四种访问控制符:public、protected、default、private。
7. 什么是Java中的继承和多态?请举例说明继承和多态在实际开发中的应用。
8. 什么是Java中的封装?请举例说明封装在实际开发中的应用。
9. 什么是Java中的接口和抽象类?它们之间有什么区别?10. 什么是Java中的异常处理?请解释try-catch-finally语句的执行顺序。
二、Java集合框架1. 请列举Java集合框架中的常用集合类及其特点。
2. 请简述ArrayList、LinkedList、HashMap、HashSet的区别。
3. 什么是Java中的泛型集合?请举例说明泛型集合的应用。
4. 什么是Java中的迭代器(Iterator)和枚举器(Enum)?请比较它们的区别。
5. 什么是Java中的List、Set、Map的遍历方法?6. 请解释Java中的ArrayList和LinkedList的内部实现原理。
7. 什么是Java中的HashMap的扩容机制?8. 什么是Java中的HashSet的内部实现原理?9. 请解释Java中的线程安全集合类,如CopyOnWriteArrayList、ConcurrentHashMap。
三、Java多线程与并发1. 什么是Java中的线程?请解释线程的创建、调度和同步。
2. 请简述Java中的线程状态,如新建、就绪、运行、阻塞、等待、超时等待、终止。
3. 什么是Java中的同步机制?请解释synchronized关键字的作用。
@valid和⾃定义异常@valid和⾃定义异常问题的产⽣:当有很多参数需要校验时,⽐如name,age,email等很多参数都需要判空,或者有长度限制时,如果后端写很多if-else就有很多代码,不美观,不优雅.前端每个参数都效验的话⼯作量也很⼤本⽂旨在解决这个问题,本⽂使⽤@valid 注解来解决这个问题.⾸先定义⼀个统⼀结果返回import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@NoArgsConstructor@AllArgsConstructor@Datapublic class Result<T> {private String msg;private Integer code;private T data;private static final Integer successCode = 200;private static Integer errorCode = 500;private static final String successMsg = "成功";private static final Object resultNoData = null;public static Result successNoResult() {return new Result(successMsg, successCode, resultNoData);}public static <T> Result<T> successWithResult(T data) {return new Result(successMsg, successCode, data);}public static Result successWithCodeAndMsg(Integer code, String msg) {return new Result(msg, code, resultNoData);}public static Result errorNoResult(String msg) {return new Result(msg, errorCode, resultNoData);}public static Result errorWithResult(String msg, Object data) {return new Result(msg, errorCode, data);}public static Result errorWithCodeAndMsg(Integer code, String msg) {return new Result(msg, code, resultNoData);}}@valid 注解简单使⽤先看下简单使⽤,复杂的⾃⼰查api吧⾸先在控制层的参数上加上该注解import javax.validation.Valid;import java.util.*;@RestController@RequestMapping("/test")public class Test2 {@RequestMapping("test2")public Result<User> test2(@Valid User user){return Result.successWithResult(user);}}然后在实体类中加上如下注解import javax.validation.constraints.NotBlank;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;public class User {/*** @NotEmpty:不能为null,⽽且长度必须⼤于0* @NotBlank:只⽤在String上,表⽰传进来的值不能为null,⽽且调⽤trim()后,长度必须⼤于0* @NotNull:不能为null,但可以为empty* @Length(message = "名称不能超过个 {max} 字符", max = 10)* @Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100)*/@NotNull( message = "ID不能为空")private Integer id;@NotBlank( message = "昵称不能为空")@Size( min = 2,max = 5,message ="昵称的字数个数必须在0和5之间" )private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}}请求该接⼝http://localhost:8080/test/test2?id=5&name=xxwwwww查看效果,如下可以看到,已经能表⽰该请求参数错误但是还有个问题,我们不能直接这样⼦直接返回给前端,需要返回统⼀的结果全局异常处理Spring-boot对于异常的处理也做了不错的⽀持,它提供了⼀个 @ControllerAdvice注解以及 @ExceptionHandler注解,前者是⽤来开启全局的异常捕获,后者则是说明捕获哪些异常,对那些异常进⾏处理。
UBF自定义异常方法异常处理的重要性在编程过程中,可能会出现各种错误和异常情况。
这些异常情况可能是由于用户输入错误、系统故障或者其他不可预见的原因导致的。
为了保证程序的稳定性和可靠性,我们需要对这些异常情况进行适当的处理。
异常处理是一种程序设计技术,用于检测、捕获和处理在程序执行期间发生的异常事件。
通过合理地处理异常,我们可以使程序在遇到错误时能够恢复正常运行,提高程序的健壮性。
在Java中,异常是以对象的形式存在的。
Java提供了一些内置的异常类,如NullPointerException、ArrayIndexOutOfBoundsException等。
除此之外,我们还可以自定义异常类来满足特定需求。
UBF自定义异常方法概述UBF(Unified Business Framework)是一种面向服务架构(SOA)开发框架,用于简化企业级应用开发过程。
在UBF框架中,我们可以使用自定义异常方法来增强系统对各种错误和异常情况的处理能力。
UBF自定义异常方法允许开发人员根据具体业务需求定义自己的异常类,并在代码中抛出这些自定义异常。
通过使用自定义异常方法,我们可以更加准确地描述和处理系统中的异常情况,提高系统的可维护性和可读性。
UBF自定义异常方法的实现步骤步骤1:定义异常类首先,我们需要定义一个自定义异常类。
这个异常类应该继承自ng.Exception类或其子类,并提供适当的构造方法和错误信息。
public class MyException extends Exception {public MyException() {super("MyException occurred");}public MyException(String message) {super(message);}}在上面的代码中,我们定义了一个名为MyException的自定义异常类。
这个异常类继承自ng.Exception类,并提供了两个构造方法:一个无参构造方法和一个带有错误信息参数的构造方法。
浅谈Java自定义异常在教学中的教与学摘要:本文主要阐述java自定义异常为消除错误,编写健壮代码,开发可靠的软件系统,提供重要保障,讨论如何编写自定义异常以及异常抛出、异常捕获、异常处理的规范和原则,并探讨在教学实施中的模式及经验效果。
关键词:异常类;自定义异常;抛出异常;捕获异常中图分类号:tp307在java程序设计语言的基础教学中,异常处理作为独立的一部分知识体系存在。
经过多年的教学研究,发现学生对异常这一部分的掌握程度仅限于对可能产生异常的语句进行捕获,而对异常内部的机制和自定义异常了解得很少,通常只是机械式的使用工具软件执行try-catch-finally语句,进而顺应编写代码的规范,确保程序能够继续执行下去。
对于自定义异常部分,是绝大多数学习者的盲点。
而学习自定义异常是学生掌握整个异常知识脉络的关键内容,学习它能够使异常更加灵活的在应用程序中扮演多变的角色。
1 为什么要出现自定义异常机制?java异常机制为使用者提供大量常用的系统异常,这些系统异常为通用的异常情况而设计,如文件异常,数组越界异常等等,学习和理解起来比较容易。
而在实际的开发中,系统异常不可能在开发工作中面面俱到,总会有些特别的需求出现。
如果在开发过程中遇到任何java提供的异常类都不能描述的异常情况时,就需要自己对其定义。
自定义异常就是为了在实际的软件开发应用中填补这种特殊的需要而设计。
另外,自定义异常与系统异常相比,相对控制性要更高,整体辨识度更高,与系统异常搭配使用,能够更充分的满足业务需求和系统需求。
2 自定义异常的作用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进⾏默认处理,则此时会导致程序中断执⾏。
产⽣异常的原因:⽤户输⼊了⾮法数据。
要打开的⽂件不存在。
四个步骤:
1.自定义异常:
class 异常类名extends Exception
{
public 异常类名(String msg)
{
super(msg);
}
}
2.标识可能抛出的异常:
throws 异常类名1,异常类名2
3.捕获异常:
try{}
catch(异常类名y){}
catch(异常类名y){}
4.方法解释
getMessage() //输出异常的信息
printStackTrace() //输出导致异常更为详细的信息
实例:
/*自定义异常*/
class ChushulingException extends Exception
{
public ChushulingException(String msg)
{
super(msg);
}
}
class ChushufuException extends Exception
{
public ChushufuException(String msg)
{
super(msg);
}
}
/*基础方法通过throws或者throw抛出异常自定义异常*/
class Numbertest
{
public int shang(int x,int y) throws ChushulingException,ChushufuException
{
if(y<0)
{
throw new ChushufuException("您输入的是"+y+",规定除数不能为负数!");//抛出异常}
if(y==0)
{
throw new ChushulingException("您输入的是"+y+",除数不能为0!");
}
int m=x/y;
return m;
}
}
/*应用方法通过try{}catch(){}捕获自定义异常*/
class Rt001
{
public static void main(String[]args)
{
Numbertest n=new Numbertest();
//捕获异常
try
{
System.out.println("商="+n.shang(1,-3));
}
catch(ChushulingException yc)
{
System.out.println(yc.getMessage());
yc.printStackTrace();
}
catch(ChushufuException yx)
{
System.out.println(yx.getMessage());
yx.printStackTrace();
}
catch(Exception y)
{
System.out.println(y.getMessage());
y.printStackTrace();
}
finally{ System.out.println("finally!");} ////finally不管发没发生异常都会被执行
}
}。