Java 异常处理及其应用
- 格式:wps
- 大小:125.86 KB
- 文档页数:9
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.空指针异常(ng.nullpointerexception)发⽣该情况⼀般是字符串变量未初始化,数组未初始化,类对象未初始化等。
还有⼀种情况是当该对象为空时你并没有判断是否为空值,这个错误我在之前的web习题上犯过,因此为了避免这种情况,除了检查是否初始化之外,如有必要则要加上判断是否为null的if语句。
2.指定的类不存在(ng.ClassNotFoundException)出现这个错误的原因之⼀是缺包,这时只要下载并导⼊相应的包即可;当我们已经把包导⼊的时候,⼜报了这种错误的情况下,就需要开启⾃⼰的编辑器去调整设置了;在使⽤tomcat的时候,先检查lib中是否导⼊了jar。
3.字符串转换为数字异常(ng.NumberFormatException)这个错误就是字符串中出现⾮数字型字符时,转换为数字时发⽣异常;除此之外,如果字符串转换为数字时超过了类型的范围(⽐如string转int和string转double),也会出现这个错误。
解决该问题的⽅法就是在转换之前先对字符串进⾏检查。
4.数组下标越界异常(ng.IndexOutOfBoundsException)顾名思义,你想取的数组元素在数组中并没有定义出来,⽐如定义了⼀个长度为5的数组a,当你想取a[6]元素时肯定会出错。
解决这类问题就是要注意数组的长度,有时候为了减少空间浪费我们会使⽤动态数组构建⽅法,这时在对数组进⾏操作时建议先⽤length获取其数组长度,从⽽规避错误。
5.数学运算异常(ng.ArithmeticException)除数为0时会报出该错误,解决⽅法:避免除数为0。
这个错误解读为“出现异常的运算条件”,除了除数为0的情况之外,可能还有其他的异常情况,届时具体情况具体分析。
实验十一Java中的异常处理x=n.nextInt();if(x!=999)sum+=x;}catch(InputMismatchException e){}System.out.println(sum);}}}class TestXin{/*** @param args*/public static void main(String[] args) { // TODO Auto-generated method stubXin n=new Xin();System.out.println(n);}}结果:五、实验总结(对本实验结果进行分析, 实验心得体会及改进意见)5.分析程序的运行结果(1)class A{A(){System.out.println("A structure!");}A(int m){System.out.println("A("+m+")");}}public class B extends A{B(int m){System.out.println("B("+m+")");}public static void main(String[] args) { // TODO Auto-generated method stubnew B(100);}}(2)class A{A(){System.out.println("A structure!");}A(int m){System.out.println("A("+m+")");}}public class B extends A{B(){System.out.println("B structure!");}B(int m){System.out.println("B("+m+")");}public static void main(String[] args) { // TODO Auto-generated method stubnew B(100);}}(3)class A{A(){System.out.println("A structure!");}A(int m){System.out.println("A("+m+")");}}public class B extends A{B(){System.out.println("B structure!");}B(int m){//super(m);System.out.println("B("+m+")");}public static void main(String[] args) { new B(100);}}(4)class A{A(){System.out.println("A structure!");}A(int m){System.out.println("A("+m+")");}}public class B extends A{B(int m){super(m);//System.out.println("B("+m+")");}public static void main(String[] args) { new B(100);} }。
程序异常处理引子O在调试航班体息录入程冲•时.町能会遇到这歼的情爲:应用程斤运行过程中.突然中止,屛棗上出现一丸堆英丈让人不知所培・o崔许多域市.很行ATM机随处可见,取歇非常方使•崔ATM机上取欲必须扶輒一定钓步裝携作.若挨作出会相应的災示传息.指导你下一步地楼作.比如密码输入错谖.ATM机将会显示诗码输入错谋・请重新输入”的消息•如是三次密碣伦入梆有谋.則呑卡没商量.o尢论什么斥因引起的程斤运行不正常.都认为是悝序出现了并常.知识要点。
异常的概念。
常见的异常情况。
异常处理的机制◎利用try catch finally实现异常处理o利用thro灵throws创建用户自定义异常知识学习一异常概念。
异常一血巾把程序运行中可能遇到的错罠分为两类.一类是非致命的.的过某种修正后程号还能键续执行.这类捲谖称为异常.边是一类特殊的运行错误対象. 另一类是致命的.即程序遇到了非常严重的不正常状态,不能简单地恢复轨行,这就是钳渓.叩异常类基类throwablcift生出两个子类:Error类:定义了Java程序运行时出现了灾难性失败的畀常.一股来说java程序不捕获也不拋出^Error的对象(包把动态磁接失败.虛拟机错逞等)•而只处理Except ion类的各子类对Exception类:定义了程序可以捕捉到的异常。
异営分两类:1)条统定义的2)用户定义的;・:・异常处理一对于异常,Java使用一种错误捕获方法进行) 处理,称为异常处理. 1斗处理异常的两种方式-是将异常交田Jam异常处理机制的预设处理方法来处理。
二是利用Java提供的try-cat ch-final ly语句对于㊁能出现的异常作预先处理。
"融辜习一程序运行的错误类型及位置识学习程序ArithmeticException 算术异常整数除法中,如果除数为0,则发生该类井常.Java虛拟机遇到这样的错i昊时会中止程序的执行流程,并新建~个ArithmeticException类的对象.即拋出一个算术运算异常.例如下面的程序将引发ArithmeticException异常:public class Test ArithmeticExceptionfpublic static void main(String args[])(int denominator=0,numerator=20jesult=0;resultanumerator/denominator;〃除数为0,将引发ArithmeticException异席System.out.prlntln(result);知识学习一程序运行的错误类型及位置NullPointerExcept ion异常发生的原因.通常是由于应用程序企图在某个需要的对鮫上使用mil I值。
根据实验结果,可以得出以下结论:
1. 异常处理是一种有效的方式来处理程序中的错误和异常情况。
通过使用try-catch语句,可以捕获并处理异常,避免程序崩溃或产生不可预料的结果。
2. 在捕获异常时,应该根据具体的异常类型来选择合适的处理方式。
可以使用多个catch块来处理不同类型的异常,以便进行针对性的处理。
3. 在catch块中,可以采取不同的操作,如打印错误信息、记录日志、重新抛出异常等。
具体的操作应根据实际情况来决定。
4. 异常处理还可以使用finally块来执行一些必要的清理操作,无论是否发生异常都会执行。
finally块通常用于释放资源或关闭连接等操作。
5. 可以自定义异常类来表示程序中的特定异常情况。
自定义异常类应继承自Exception类或其子类,并实现自己的构造方法和其他必要的方法。
总之,异常处理是编写健壮和可靠的程序的重要组成部分。
通过合理
地处理异常,可以提高程序的稳定性和可维护性。
浅析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常见异常1. ng.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。
对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。
数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)2. ng.classnotfoundexception这个异常是很多原本在jb等开发环境中开发的程序员,把jb下的程序包放在wtk下编译经常出现的问题,异常的解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可,如果是在jb下做的程序包,一般都是默认加上package的,所以转到wtk下后要注意把package的路径加上。
3. ng.arithmeticexception这个异常的解释是"数学运算异常",比如程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。
4. ng.arrayindexoutofboundsexception这个异常相信很多朋友也经常遇到过,异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。
Java 异常处理引出(重庆IT论坛)假设您要编写一个Java 程序,该程序读入用户输入的一行文本,并在终端显示该文本。
程序如下:1 import java.io.*;2 public class EchoInput {3 public static void main(String args[]){4 System.out.println("Enter text to echo:");5 InputStreamReader isr = new InputStreamReader(System.in);6 BufferedReader inputReader = new BufferedReader(isr);7 String inputLine = inputReader.readLine();8 System.out.println("Read:" + inputLine);9 }10 }分析上面的代码,在EchoInput 类中,第 3 行声明了main 方法;第 4 行提示用户输入文本;第5、6 行设置BufferedReader 对像连接到InputStreamReader,而InputStreamReader 又连接到标准输入流System.in;第7 行读入一行文本;第8 行用标准输出流System.out 显示出该文本。
表面看来上面的程序没有问题,但实际上,EchoInput 类完全可能出现问题。
要在调用第7 行的readLine 方法时正确读取输入,这几种假设都必须成立:假定键盘有效,键盘能与计算机正常通信;假定键盘数据可从操作系统传输到Java 虚拟机,又从Java 虚拟机传输inputReader。
大多数情况下上述假设都成立,但不尽然。
为此,Java 采用异常方法,以应对可能出现的错误,并采取步骤进行更正。
在本例中,若试图编译以上代码,将看到以下信息:Exception in thread "main" ng.Error: Unresolved compilation problem:Unhandled exception type IOExceptionat EchoInput.main(EchoInput.java:7)从中可以看到,第7 行调用readLine 方法可能出错:若果真如此,则产生IOException 来记录故障。
编译器错误是在告诉您,需要更改代码来解决这个潜在的问题。
在JDK API 文档中,可以看到同样的信息。
我们可以看到readLine 方法,如图 1 所示。
图 1. BufferedReader 类的readLine 方法的JDK API 文档由图1 可知,readLine 方法有时产生IOException。
如何处理潜在的故障?编译器需要“捕获”或“声明”IOException。
“捕获(catch)”指当readLine 方法产生错误时截获该错误,并处理和记录该问题。
而“声明(declare)”指错误可能引发IOException,并通知调用该方法的任何代码:可能产生异常。
若要捕获异常,必须添加一个特殊的“处理代码块”,来接收和处理IOException。
于是程序改为如下:1 import java.io.*;2 public class EchoInputHandle {3 public static void main(String args[]){4 System.out.println("Enter text to echo:");5 InputStreamReader isr = new InputStreamReader(System.in);6 BufferedReader inputReader = new BufferedReader(isr);7 try{8 String inputLine = inputReader.readLine();9 System.out.println("Read:" + inputLine);10 }11 catch(IOException exc){12 System.out.println(“Exception encountered: ” + exc);13 }14 }15 }新添的代码块包含关键字try 和catch(第7,10,11,13 行),表示要读取输入。
若成功,则正常运行。
若读取输入时错误,则捕获问题(由IOException 对象表示),并采取相应措施。
在本例,采用的处理方式是输出异常。
若不准备捕获IOException,仅声明异常,则要特别指定main 方法可能出错,而且特别说明可能产生IOException。
于是程序改为如下:1 import java.io.*;2 public class EchoInputDeclare {3 public static void main(String args[]) throws IOException{4 System.out.println("Enter text to echo:");5 InputStreamReader isr = new InputStreamReader(System.in);6 BufferedReader inputReader = new BufferedReader(isr);7 String inputLine = inputReader.readLine();8 System.out.println("Read:" + inputLine);9 }10 }从上面的这个简单的例子中,我们可以看出异常处理在Java 代码开发中不能被忽视。
Java 异常以及异常处理可将Java 异常看作是一类消息,它传送一些系统问题、故障及未按规定执行的动作的相关信息。
异常包含信息,以将信息从应用程序的一部分发送到另一部分。
编译语言为何要处理异常?为何不在异常出现位置随时处理具体故障?因为有时候我们需要在系统中交流错误消息,以便按照统一的方式处理问题,有时是因为有若干处理问题的可能方式,但您不知道使用哪一种,此时,可将处理异常的任务委托给调用方法的代码。
调用者通常更能了解问题来源的上下文,能更好的确定恢复方式。
图2 是一个通用消息架构。
图 2. 通用消息架构从上图可以看出,必定在运行的Java 应用程序的一些类或对象中产生异常。
出现故障时,“发送者”将产生异常对象。
异常可能代表Java 代码出现的问题,也可能是JVM 的相应错误,或基础硬件或操作系统的错误。
异常本身表示消息,指发送者传给接收者的数据“负荷”。
首先,异常基于类的类型来传输有用信息。
很多情况下,基于异常的类既能识别故障本因并能更正问题。
其次,异常还带有可能有用的数据(如属性)。
在处理异常时,消息必须有接收者;否则将无法处理产生异常的底层问题。
在上例中,异常“产生者”是读取文本行的BufferedReader。
在故障出现时,将在readLine 方法中构建IOException 对象。
异常“接收者”是代码本身。
EchoInputHandle 应用程序的try-catch 结构中的catch 块是异常的接收者,它以字符串形式输出异常,将问题记录下来。
回页首Java 异常类的层次结构在我们从总体上了解异常后,我们应该了解如何在Java 应用程序中使用异常,即需要了解Java 类的层次结构。
图3 是Java 类的层次结构图。
图 3. Java 类的层次结构在Java 中,所有的异常都有一个共同的祖先Throwable(可抛出)。
Throwable 指定代码中可用异常传播机制通过Java 应用程序传输的任何问题的共性。
Throwable 有两个重要的子类:Exception(异常)和Error(错误),二者都是Java 异常处理的重要子类,各自都包含大量子类。
Exception(异常)是应用程序中可能的可预测、可恢复问题。
一般大多数异常表示中度到轻度的问题。
异常一般是在特定环境下产生的,通常出现在代码的特定方法和操作中。
在EchoInput 类中,当试图调用readLine 方法时,可能出现IOException 异常。
Error(错误)表示运行应用程序中较严重问题。
大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java 虚拟机)出现的问题。
例如,当JVM 不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。
Exception 类有一个重要的子类RuntimeException。
RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。
例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和ArrayIndexOutOfBoundException。
回页首Java 异常的处理在Java 应用程序中,对异常的处理有两种方式:处理异常和声明异常。
处理异常:try、catch 和finally若要捕获异常,则必须在代码中添加异常处理器块。
这种Java 结构可能包含3 个部分,都有Java 关键字。
下面的例子中使用了try-catch-finally 代码结构。
1 import java.io.*;2 public class EchoInputTryCatchFinally {3 public static void main(String args[]){4 System.out.println("Enter text to echo:");5 InputStreamReader isr = new InputStreamReader(System.in);6 BufferedReader inputReader = new BufferedReader(isr);7 try{8 String inputLine = inputReader.readLine();9 System.out.println("Read:" + inputLine);10 }11 catch(IOException exc){12 System.out.println("Exception encountered: " + exc);13 }14 finally{15 System.out.println("End. ");16 }17 }18}其中:∙try 块:将一个或者多个语句放入try 时,则表示这些语句可能抛出异常。