浅谈Java自定义异常在教学中的教与学
- 格式:pdf
- 大小:694.16 KB
- 文档页数:2
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 异常体系结构Java 把异常当作对象来处理,并定义一个基类java. lang. Throwable 作为所有异常的超类。
在 Java API 中已经定义了许多异常类,这些异常类分为两大类,错误 Error 和异常 Exception 。
Thorwable 类所有异常和错误的超类,有两个子类 Error 和 Exception ,分别表示错误和异常。
其中异常类 Exception 又分为运行时异常(RuntimeException) 和非运行时异常,也称之为不检查异常(Unchecked Exception )和检查异常(Checked Exception )。
Error 是程序无法处理的错误,比如 OutOfMemoryError 、ThreadDeath 等。
这些异常发生时, Java 虚拟机(JVM )一般会选择线程终止。
Exception 是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。
程序中应当尽可能去处理这些异常。
运行时异常都是 RuntimeException 类及其子类异常,如NullPointerException 、 IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度1/ 3尽可能避免这类异常的发生。
非运行时异常是 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。
从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
如IOException 、SQLException 等以及用户自定义的Exception 异常,一般情况下不自定义检查异常。
二、异常的捕获和处理 Java 异常的捕获和处理是一个不容易把握的事情,如果处理不当,不但会让程序代码的可读性大大降低,而且导致系统性能低下,甚至引发一些难以发现的错误。
解读Java异常教学中的几个问题摘要:在Java基础语言的学习中,由于编写的基础程序往往短小简单,并且同学们也热衷于算法的思考,所以常常轻视一些Java的核心机制的细致学习,像异常处理这样的知识点。
为了加深同学们对异常处理机制的理解和重视,应在学习中应多加使用,比较用法特点,从而增加程序的可靠性和健壮性。
关键词:Java;异常教学;容错;问题在软件系统的开发过程中,程序中出现错误是避免不了的,应用程序的开发过程实际上是一个不断排除错误的过程。
而Java的异常处理提供了对程序运行时错误的语言进行处理的机制,使得程序即便在错误的干扰下还能够继续运行,不会导致程序的非正常终止,是采用Java语言开发的软件具有高度的可靠性、稳定性和健壮性的有效体现。
因此,不但要学习异常处理,更应该学好、用好这一重要机制。
但在Java语言的基础学习中,学生往往关注于程序的建模和算法环节,却经常忽视对错误和异常环节的处理。
显然这是对编程的一种错误认识,带有很大的局限性。
对于学生来说,造成这种现象的原因主要是对异常处理机制的浅显认识和应用上的模糊所造成的。
下面,我们就对异常处理中的几个问题作一下探讨。
一、抛出异常异常事件的整个处理过程其实就是一个发现问题、分析问题和解决问题的过程。
在程序的运行中会出现不同的异常事件,将阻止程序的正常运行。
我们要想防患于未然,必须对某些有出现异常可能的程序段进行监控,能够及时地发现,才能够及时地捕捉、处理。
简单得说,发现异常的代码就可以“抛出”一个异常对象,把它交由系统,寻找相应的程序来处理。
可见抛出异常对异常处理的整个过程是很关键的,并且同学们容易在这点上用法模糊。
抛出异常分两种形式:1.异常对象是由Java虚拟机抛出。
但凡处理异常,大家都知道“try{}—catch{}—finally{}”语句。
其中,try{}语句用于监听一段可能出现异常的代码,而为了使程序在出现异常后还能顺利继续运行,Java虚拟机会自动生成相应的异常对象,原来的程序流程将会在此程序处中断。
1.1通过代码实例跟我学Java语言程序设计及应用技术——如何在项目中添加自定义的异常类型1、添加自定义异常信息处理功能类(1)熟悉和了解在Java中自定义异常类的基本规则1)为什么要自定义异常类?——统一进行异常处理,提供更准确的错误信息(中文信息)2)如何定义自己的异常类?——从系统中的“某个异常类”进行继承,或者选择从Exception类进行继承(2)在客户端项目中添加OASystemException类(3)OASystemException类的代码示例package com.px1987.imsystem.exception;public class OASystemException extends Exception {public OASystemException() {}public OASystemException(String message) {super(message);}public OASystemException(Throwable cause) {super(cause);}public OASystemException(String message, Throwable cause) { super(message, cause);}}2、在客户端项目中应用该异常类型package com.px1987.imsystem.socketclient;import java.io.DataInputStream;import java.io.IOException;import java.io.PrintStream;import .Socket;import .UnknownHostException;import com.px1987.imsystem.exception.OASystemException;public class IMSystemSocketClientApp {private String serverSocketListenerHostName="127.0.0.1";private int serverSocketListenerPort=3721;private Socket clientSocket=null;private DataInputStream clientSocketInputStream=null;private PrintStream clientSocketOutputStream=null;public IMSystemSocketClientApp() {}public void connectToServer() throws OASystemException{try {clientSocket=new Socket(serverSocketListenerHostName,serverSocketListenerPort);} catch (UnknownHostException e) {throw new OASystemException("不能正确地连接服务器,可能是服务器没有启动或者IP有错");} catch (IOException e) {throw new OASystemException("不能正确地连接服务器,可能是服务器没有启动或者IP有错"); }}public void getSocketInputAndOutputStream() throws OASystemException{try {clientSocketInputStream=new DataInputStream(clientSocket.getInputStream());} catch (IOException e) {throw new OASystemException("不能正确地获得客户端的输入流,可能是服务器已经关闭");}try {clientSocketOutputStream=new PrintStream(clientSocket.getOutputStream());} catch (IOException e) {throw new OASystemException("不能正确地获得客户端的输出流,可能是服务器已经关闭");}}boolean stopRequest=true;public void sendRequestAndGetResponseFromServer() throws OASystemException{DataInputStream keyBoardInputStream=null;String userInputTextFromKeyBoard=null;String someResultTextFromServer =null;while(stopRequest){System.out.print(":");System.out.flush();keyBoardInputStream=new DataInputStream(System.in);try {userInputTextFromKeyBoard =keyBoardInputStream.readLine();if(userInputTextFromKeyBoard!=null){clientSocketOutputStream.println(userInputTextFromKeyBoard);someResultTextFromServer =clientSocketInputStream.readLine();if(someResultTextFromServer!=null){System.out.println(someResultTextFromServer);}else{System.out.println("服务器已经关闭了,客户程序也自动退出");break;}}else{break;}} catch (IOException e) {e.printStackTrace();throw new OASystemException("服务器已经关闭了");}}}public void closeAllStreamAndSocket() throws OASystemException {try {clientSocketInputStream.close();} catch (IOException e1) {e1.printStackTrace();}clientSocketOutputStream.close();try {clientSocket.close();} catch (IOException e) {throw new OASystemException("不能正确地关闭Socket客户对象,可能是客户端程序出现了错误");}}public static void main(String[] args) {IMSystemSocketClientApp oneIMSystemSocketClientApp=null;try{oneIMSystemSocketClientApp=new IMSystemSocketClientApp();oneIMSystemSocketClientApp.connectToServer();oneIMSystemSocketClientApp.getSocketInputAndOutputStream();oneIMSystemSocketClientApp.sendRequestAndGetResponseFromServer();}catch(OASystemException e){System.out.println(e.getMessage()); //在此才实现错误信息的显示}finally{try{oneIMSystemSocketClientApp.closeAllStreamAndSocket();}catch(OASystemException e){System.out.println(e.getMessage());}}}}3、课后作业1、对项目中的服务器端的程序进行“重构”,增加自定义的异常“类型转换”和异常错误信息的“翻译”。
Java异常处理机制的原理和应用1. 异常处理机制的概述Java异常处理机制是一种用于处理程序在运行时可能出现的异常情况的机制。
在Java程序中,当某个方法出现了异常,可以选择将异常抛出并交给上层调用者处理,也可以捕捉异常并在当前方法中进行处理。
异常处理机制能够有效地保护程序免受意外错误的影响,并提供了一种标准的处理方式,使程序更加健壮和可读。
2. 异常的分类Java中的异常分为两大类型:可查异常和运行时异常。
2.1 可查异常可查异常是指在Java代码中,编译器能够预见到可能会出现的异常情况。
这些异常一般都是由外部因素引起的,例如输入/输出操作中的文件不存在、网络连接中断等。
在编写程序时,必须对可能发生的可查异常进行处理,否则编译器会报错。
可查异常包括: - IOException:输入/输出操作异常 - SQLException:SQL数据库操作异常- FileNotFoundException:文件不存在异常- MalformedURLException:URL格式异常等2.2 运行时异常运行时异常是指由于程序逻辑错误或代码疏忽等原因导致的异常。
与可查异常不同,运行时异常一般不需要进行显式的处理,编译器也不会强制要求捕获这些异常。
常见的运行时异常包括: - NullPointerException:空指针异常 - ArrayIndexOutOfBoundsException:数组索引越界异常 - ArithmeticException:算术运算异常 - IllegalArgumentException:非法参数异常等3. 异常处理机制的原理Java的异常处理机制采用异常处理框架来实现,主要包括以下几个关键组成部分:3.1 try-catch块Java中的异常处理机制通过使用try-catch块来捕获和处理异常。
在try块中,我们编写可能会引发异常的代码。
当在try块中的代码出现异常时,会立即跳转到与之相匹配的catch块进行异常处理,从而避免程序的崩溃。
1.1Java语言程序设计课程教学辅导技术资料——第9章异常(例外)处理技术及应用【教学目标】在本单元中希望您重点了解并掌握如下知识点:Java异常编程规则,try、catch、finally 语句,声明和抛出异常,用户自定义异常类的编程规则。
1.1.1Java异常编程技术1、有关异常方面的基础知识(1)错误处理在进行程序设计时,错误的产生是不可避免的。
这是任何程序设计语言都要解决的问题。
(2)如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?(3)什么是异常程序在运行过程中所发生的错误事件(如数组越界、文件操作时未找到文件、除法溢出等),而这些错误在设计时不能准确地识别出但又可能会发生或者不会发生;同时它会中断指令的正常执行。
import java.io.*;class ExceptionDemo{ public static void main(String args[]){FileInputStream fis=new FileInputStream("text"); //如果所打开的文件名不存在的int b; //情况下将产生异常while((b=fis.read()) != -1){ System.out.println(b);}fis.close();}}(4)正确理解程序设计中的三种错误语法错误(编译时的错误);逻辑错误(运行时的错误);异常错误(运行时的错误但取决于执行环境)。
(5)异常的特点(以“人身保险”为例加以说明异常的特性)程序在运行过程中所发生的错误事件程序员在编程时无法预知它是否会产生产生与否取决于用户当时的执行环境。
1.1.2Java中的异常处理1、Java中的异常处理:它是面向对象方式的错误处理方法。
2、非结构化错误处理的缺点(1)代码很难阅读、调试和维护(2)容易忽视错误(3)通过函数的返回值来发出错误信息,这易于导致很多错误并且无法提供错误产生的内部细节。
Java异常处理与自定义异常作者:笪林梅来源:《电脑知识与技术》2010年第05期摘要:Java程序运行期间发生的错误称为异常。
异常产生后,应有相应的异常处理机制来捕获异常或抛出异常。
JDK平台为我们提供了丰富和完整的异常类,通过它们来处理程序运行中的错误,防止错误对程序造成影响,确保程序能够安全运行。
当这些异常类不能捕获实际应用中的异常时,就需要用户自定义异常。
异常处理和用户自定义异常的正确与灵活运用,将有效地增强程序的交互性,增加程序的完整性。
关键词:异常;捕获;抛出;异常类;自定义异常中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)05-1123-03Exception Handling and User-defined Exception in JAVA ProgrammingDA Lin-mei(Jiangsu Vocational and Technical College of Finance & Economics, Huai'an 223003, China)Abstract: The error occured during the Java program names exception. When it happens, there should be a corresponding exception handling mechanism to capture the exception or throw out it. JDK platform provides us with a rich and complete exception classes, through which we can deal with the error during the running of programs, in order to prevent the effect made by the error. Then the program can run safely. When these exception classes can not capture the exception in the practical application, it needs us to define the exception by ourselves. The same as exception handling ,the accurately and flexiblely using of user-defined exception will effectively enhance the interactiveness and the integrity of the program.Key words: exception; capture the exception; throw out the exception; exception classes; user-defined exception众所周知,Java编程语言的特点之一是它的健壮性。
java 自定义异常
在特定的问题领域,可以通过扩展Exception类或RuntimeException类来创建自定义的异常。
异常类包含了和异常相关的信息,这有助于负责捕获异常的catch 代码块,正确的分析并处理异常。
在分层的软件结构中,会存在自上而下的依赖关系,也就是说上层的子系统会访问下层子系统的API。
图8-8所示了一个典型的分层结构。
图8-8 分层的软件系统
在上图中,客户层访问业务逻辑层,而业务逻辑层访问数据库层。
数据库层把异常抛给业务逻辑层,业务逻辑层把异常抛给客户层,客户层则把异常抛给终端用户。
当位于最上层的子系统不需要关心来自底层的异常的细节时,常见的做法是捕获原始的异常,把它转换为一个新的不同类型的异常,再抛出新的异常,这种处理异常的办法称为异常转译。
例如,假设终端用户通过客户界面把一个图像文件上传到数据库中,客户层调
SQLException。
但是用户没有必要关心异常的底层细节,他们仅需要知道上传图像失败,具体的调试和排错由系统管理员或者软件开发人员来处理。
因此,uploadImageFile()方法捕获到原始的异常后,在catch代码块中先把原始的异常信息记入日志,然后向用户抛出UploadException异常。
从面向对象的角度来理解,异常转译使得异常类型与抛出异常的对象的类型位于相同的抽象层。
例如,车子运行时会出现故障异常,而职工开车上班会出现异常,车子的故障异常是导致职工迟到异常的原因。