java类的方法之异常
java异常处理机制
java异常处理机制
Java的异常处理是结构化编程的一个重要方面。
它提供了一种通用的方式来处理发生在应用程序或系统中的异常,比在代码中添加报错信息更有效。
Java异常处理模型包括异常类,异常处理器,throw和throws关键字以及堆栈跟踪。
异常类是Java的一种特殊类,它表示程序的异常状态(或者是错误情况)。
它从Java的Throwable类继承,Throwable类有两个子类,Exception和Error,它们派生出一组定义在Java中的异常。
异常处理器允许处理一个或多个特定类型的异常,是程序中处理异常的机制。
异常处理器通常作为程序的一部分,程序员可以通过编写异常处理器来为应用程序创建一个可以处理未知错误的安全环境。
Throw和throws关键字用于抛出异常。
Throw关键字用于将异常抛出到当前函数的调用点,throws关键字用于声明哪些异常可以被抛出,以便该方法的调用者可以捕获和处理它们。
堆栈跟踪是一种异常处理工具,可以展示异常期间应用程序运行的具体位置,同时可以追踪嵌套方法调用,并可以提供出现异常时的参数值,类型等等。
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三种异常处理方法Java是一种流行的编程语言,但是在编写程序时常常会遇到各种异常。
为了使程序更加健壮和稳定,我们需要使用异常处理机制。
Java中有三种异常处理方法:1. try-catch语句try-catch语句是最常用的异常处理方法。
它的基本语法如下: ```try {// 可能会抛出异常的代码} catch (Exception e) {// 异常处理代码}```在try块中,我们编写可能会抛出异常的代码。
如果这些代码抛出了异常,那么程序就会跳转到catch块中。
catch块中的代码会处理异常,可以输出异常信息,也可以进行其他操作。
2. throws关键字throws关键字可以将异常抛给调用该方法的上一级方法处理。
它的语法如下:```public void method() throws Exception {// 可能会抛出异常的代码}```在方法声明中使用throws关键字,表明该方法可能会抛出某种异常。
如果抛出了异常,异常将会被抛给该方法的调用者处理。
3. finally关键字finally关键字用于编写一段无论是否发生异常都会被执行的代码块。
它的语法如下:```try {// 可能会抛出异常的代码} catch (Exception e) {// 异常处理代码} finally {// 无论是否发生异常都会执行的代码}```在try-catch语句中使用finally块,可以确保无论是否发生异常,finally块中的代码都会被执行。
通常,finally块中会释放资源或者进行一些清理操作。
以上是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");}使用异常的注意事项在使用异常处理时,需要注意以下几点:•捕获异常的顺序非常重要,应该从特定异常到一般异常的顺序进行捕获。
Java中的异常现象
Java中的异常现象一、基本异常异常情形:指引发阻止当前方法或作用域继续执行的问题.普通问题:在当前环境下能得到足够的信息,总能处理这个错误.而异常情形就不同了.发生了异常后,不能继续下去,因为在当前环境下无法获得必要的信息来解决当前的问题.你所能做的就是从当前环境跳出,并且把问题提交给上一级环境,这一动作就是抛出异常.抛出异常所做的动作:1、用new在堆上创建对象.2、当前执行的程序被终止,从当前环境中弹出对象的引用.此时,由异常处理机制接管程序,并开始寻找一个恰当的地方来执行程序.这个地方就是”异常处理程序”,它的任务就是将程序从错误状态中恢复,以使程序要么换一种方式运行,要么继续运行下去.注意:抛出异常是由方法抛出的.异常也是一个类!并用这个类在堆上建立对象.所有的异常类都有两个构造器:1、缺省的构造器Exception();2、带参数的构造器Exception()的括弧中加上参数.注:要定义自己的异常类,必须从已有的异常类继承。
二、捕获异常如果方法要抛出异常,它必须假定异常将被”捕获”并得到处理.异常处理的好处之一:在一个地方编写解决问题的代码,然后在别的地方处理这些代码的错误。
首先什么是”监控区域”?它是一段可能产生异常的代码.并且后面跟着处理这些异常的代码.也就是try{//可能产生异常的语句放在此处!//在此处捕获异常}三、异常处理程序抛出的异常必须处理,这个地方就是异常处理程序.用catch表示.完整的代码如下:try{}catch(type xx){}异常处理也可以有多个catch!异常处理程序必须紧跟在try块之后,异常处理机制将负责搜索同发生异常的第一个相匹配的程序.一旦catch子句结束,则处理程序的查找过程结束.只有匹配的catch子句才能得到执行.四、终止和恢复异常处理有两种模型:终止:一旦异常抛出,就表明错误无法挽回,也不能继续执行.恢复:异常处理程序可以修正错误.然后重新尝试调用出现问题的方法.(解决办法:将出现异常的语句放在while循环中.)终止模型是今后的重点!而不要考虑恢复模型注意:1:main()作为一个方法也可以有异常说明,这里的异常的类型是Exception,它也是所有”被检查的异常”的基类.通过把它传递到控制台,就不必在main()里写try-catch子句了.尽管很方便,但这不是通用的做法.2:java语言中采用try-catch-finally结构处理异常.一个try-catch-finally结构中,必须有try 语句块,catch语句块.finally语句块不是必须的,但至少要两者取其一.如果3个语句块均存在,一定要按照try/catch/finally的顺序排列.3:catch语句块可以有多个,各catch语句块用于捕获不同的异常.如果try块中的语句在执行时发生异常,则执行从该处中断而进入catch块,根据异常的类型进行匹配,顺序在前的catch块优先进行匹配比较,只要该异常是catch中指定的异常类或其子类就匹配成功,进而执行相应的catch中的内容.4:不管在try语句块中是否抛出异常,也不管catch语句块是否捕获到异常,finally语句块中的内容都将继续被执行.注意,即使try语句块中包含return语句,也会先执行完finally语句块中的代码,再执行return语句返回方法值.5:只有执行System.exit()方法或出现Error错误时,finally语句块才不会获得执行而退出程序.6:如果没有异常出现或异常被捕获、处理,则在退出try-catch-finally结构后,会继续执行后续的代码.7:一个方法抛出异常声明时需分两步,第一步在方法名后采用throws语句声明抛出的异常,如果抛出多个异常,则在各个异常间使用逗号分隔.第二步是在方法体内部采用throw语句抛出异常,以便try语句块捕获.8:ng.Throwable类是所有异常和错误的顶层类.Throwable类有两个直接子类ng.Error和ng.Exception.Error类代表编译期和系统错误,程序员不需要处理它,Exception 类是可以从任何标准java类方法中抛出的基本类型异常,也是程序员需要处理的.注意,ng.RuntimeException异常类是由java虚拟机抛出的,不需要程序员处理.五、java标准异常Throwable这个java类被用来表示任何可以作为异常被抛出的类.它可以分Error用来表示编译时和系统错误,Exception是可以被抛出的基本类型.。
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 语句的顺序
java异常解决方案
java异常解决方案一、Hibernate(1)org.hibernate.TransientObjectException: object references an unsaved transient instance....(2)org.springframework.orm.hibernate3.HibernateSystemException: Don't change the reference to a collection withcascade="all-delete-orphan": entity.Klass.students; nested exception is org.hibernate.HibernateException: Don't change the reference to a collection with cascade="all-delete-orphan": entity.Klass.students二、Tomcat(1)tomcat启动时报错:java.io.EOFException(2)tomcat内存溢出三、JAVA基本(1)ng.ClassCastException:(2)ng.UnsupportedClassVersionError: Bad version number in .class file四、JSP(1)javax.servlet.jsp.JspException:(2)org.apache.jasper.JasperException: Unable to compile class for JSP:(3)Servlet.service() for servlet jsp threw exceptionng.Error: Unresolved compilation problem:(4)ng.Error: Unresolved compilation problem:The method contextInitialized(ServletContextEvent) of type CreateDataSourceTableListener must override a superclass method(5)Servlet.service() for servlet jsp threw exception ng.Error: Unresolved compilation problem:The method setCharacterEncoding(String) is undefined for the type ServletResponse五、SSH整合(1)ng.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener(2)Exception starting filter struts2 Class:com.opensymphony.xwork2.spring.SpringObjectFactory File: SpringObjectFactory.java Method: getClassInstance(3)(7)(8)org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'biz' defined in class path... (4)Exception starting filter struts2The action name cannot be the same as the action suffix [Action] - Class: org.apache.struts2.convention.SEOActionNameBuilder (5)avax.management.RuntimeErrorException: Error thrown in preDeregister methodCaused by: ng.NoClassDefFoundError:org/apache/struts2/util/ObjectFactoryDestroyable(6)Unable to load configuration. - bean -jar:file:/D:/Tomcat/tomcat/apache-tomcat-6.0.30/webapps/tes t/WEB-INF/lib/struts2-core-2.2.3.1.jar!/struts-default.xml: 29:72六、Struts(1)ng.NoSuchMethodException:action.StudentAction.getAllStudent()(2)Caused by: ng.ClassCastException:org.apache.xerces.parsers.XML11Configuration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration (3)No result defined for action and result七、Android(1)There is no android project named 'cm-android'一、Hibernate一(1)org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: er某个对象的某个属性是一个实体,在这个实体没有保存之前就保存这个对象而造成了这个错误。
Java中常见错误和异常解决方法(打印)
ng.NullPointerException原因是:有空指针,有地址没赋值2.Exception in thread "main" ng.ArithmeticException: / by zero原因是除数是03.ArrayIndexOutOfBoundsException原因是:数组越界原因是:数字格式化有问题5.Unhandled exception type Exception原因是:没有进行异常处理6.进行国际化操作的时候遇到这样的错误:Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name Message, locale zh_CN答:因为在命令提示符中,是没有错误的解决方法是:在myeclipse中,会出现这个错误1.初步学习最近在学习ResourseBundle时遇到了“Can't find bundle for base name ”这个错误搞了很久才解决了。
原因就是类路径问题要将属性文件放在类路径中!百度里很多都是教程但没有涉及到解决方法! 2.中文显示:测试文件java 代码package com.lht.ResourseBundleStudy;import java.util.ResourceBundle;public class ResourseBundleDemo {public static void main(String[] args) {ResourceBundle resource =ResourceBundle.getBundle("test");System.out.print(resource.getString("msg0") + "!");System.out.println(resource.getString("msg1") + "!"); }}test.propertiesmsg0="Hello World"msg1="da jia hao"开始自己测试的时候:将属性文件放在bin/下也试过也不行无赖中就在google中搜索了一下终于在sun的java论坛()中找到了线索下面是帖子的内容:I've solved the problem the best way possible. Basically what i've done is added a new class folder named config to the project home dir. Then i added this classfolder to the classpath in project properties. After doing all of this you only need to reference the properties file by "Email".Hope this helps anyone else who is having similiar problems.基本意思就是在src下建立classes(名字无所谓)文件夹将属性文件存放在下面,然后将这个文件夹加入类路径中!运行就可以了:加入类路径的方法:你的工程文件夹->properties->选择Libraries选项卡->Add Class Folder将刚才建立的文件夹加入就可以了!结果如下:"Hello World"!"da jia hao";!2.中文显示在classes目录下建立message_CH.properties内容如下:ms0="大家好"同样用上面的测试文件!结果如下:"?ó????"!乱码怎么回事啊!在百度里搜索后找到了答案有以为网友写的很清楚:下面引用如下:原理Property文件中,使用的编码方式根据机器本身的设置可能是GBK或者UTF-8。
java异常处理
Try与 Try与catch
try
捕获违例的第一步是用try{… 捕获违例的第一步是用 try{…} 语句块选定捕 获违例的范围。 获违例的范围。 catch 在catch语句块中是对违例对象进行处理 catch语句块中是对违例对象进行处理 的代码
每个try 语句块可以伴随一个或多个catch 语句, 每个 try语句块可以伴随一个或多个 catch语句 , 用 于处理可能产生的不同类型的违例对象。 于处理可能产生的不同类型的违例对象 。 与其它 对象一样, 对象一样 , 可以访问一个违例对象的成员变量或 调用它的方法。 调用它的方法。 getMessage( ) 方法,用来得到有关异常事件的信 方法, 息 printStackTrace( )用来跟踪异常事件发生时执行 堆栈的内容。 堆栈的内容。
IOExeption
从一个不存在的文件中读取数据 越过文件结尾继续读取 连接一个不存在的URL 连接一个不存在的URL
5
Java当中的异常处理机制 Java当中的异常处理机制
异常是一个对象,必须是某个异常类的实 例,这个异常必须是已经定义好的。 例,这个异常必须是已经定义好的。 Java类库中已经存在了许多异常类,每种异 Java类库中已经存在了许多异常类,每种异 常类对应着某一种或者某一类错误,类中 包含着错误的相关信息和处理方法。 如果程序发生错误的当前结构中没有处理 如果程序发生错误的当前结构中没有处理 此异常的机制,那么它将移交给外层结构 处理,如果还不行,就继续上交,直到操 处理,如果还不行,就继续上交,直到操 作系统,操作系统就会终止程序的运行。
17
异常使用中的两个问题(1) 异常使用中的两个问题(
异常的匹配:异常的控制过程与swich相似, 异常的匹配:异常的控制过程与swich相似, 但有本质区别
Java_异常类(错误和异常,两者的区别介绍)
Java_异常类(错误和异常,两者的区别介绍)在 Java 中,所有的异常都有⼀个共同的祖先 Throwable(可抛出)。
Throwable 指定代码中可⽤异常传播机制通过 Java 应⽤程序传输的任何问题的共性。
Throwable 有两个重要的⼦类:Exception(异常)和 Error(错误),⼆者都是 Java 异常处理的重要⼦类,各⾃都包含⼤量⼦类。
①.Exception(异常)是应⽤程序中可能的可预测、可恢复问题。
⼀般⼤多数异常表⽰中度到轻度的问题。
异常⼀般是在特定环境下产⽣的,通常出现在代码的特定⽅法和操作中。
在 EchoInput 类中,当试图调⽤ readLine ⽅法时,可能出现IOException 异常。
Exception 类有⼀个重要的⼦类 RuntimeException。
RuntimeException 类及其⼦类表⽰“JVM 常⽤操作”引发的错误。
例如,若试图使⽤空值对象引⽤、除数为零或数组越界,则分别引发运⾏时异常(NullPointerException、ArithmeticException)和ArrayIndexOutOfBoundException。
②.Error(错误)表⽰运⾏应⽤程序中较严重问题。
⼤多数错误与代码编写者执⾏的操作⽆关,⽽表⽰代码运⾏时 JVM(Java 虚拟机)出现的问题。
例如,当 JVM 不再有继续执⾏操作所需的内存资源时,将出现 OutOfMemoryError。
检查异常和未检查异常的划分Java中的异常分为两⼤类:1.Checked Exception(⾮Runtime Exception)2.Unchecked Exception(Runtime Exception)运⾏时异常RuntimeException类是Exception类的⼦类,它叫做运⾏时异常,Java中的所有运⾏时异常都会直接或者间接地继承⾃RuntimeException类。
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程序错误类型及异常处理
java程序错误类型及异常处理⼀、程序的错误类型在程序设计中,⽆论规模是⼤是⼩,错误总是难免的。
程序的设计很少有能够⼀次完成,没有错误的(不是指HelloWorld这样的程序,⽽是要实现⼀定的功能,具备⼀定实⽤价值的程序),在编程的过程中由于种种原因,总会出现这样或那样的错误,这些程序的错误就是我们常说的“Bug”,⽽检测并修正这些错误的⽅法就是“Debug”(调试)。
基本上所有的集成开发环境都提供了强⼤的和程序调试功能,在程序进⾏编译,连接,运⾏时,会对程序中错误进⾏诊断。
程序的错误可以抽象分为三类:语法错误、运⾏错误和逻辑错误。
1、语法错误是指由于编程中输⼊不符合语法规则⽽产⽣的。
程序编译就通不过,程序不能运⾏起来。
此类错误最简单,调试起来⽐较容易例如:表达式不完整、缺少必要的标点符号、关键字输⼊错误、数据类型不匹配、循环语句或选择语句的关键字不匹配等。
通常,编译器对程序进⾏编译的过程中,会把检测到的语法错误以提⽰的⽅式列举出来,⼜称为编译错误。
语法错误的调试,则可以由集成开发环境提供的调试功能来实现,在程序进⾏编译时,编译器会对程序中的语法错误进⾏诊断。
编译诊断的语法错误分为3中:致命错误、错误和警告。
(1)致命错误:这个错误⼤多是编译程序内部发⽣的错误,发⽣这类错误时,编译被迫中⽌,只能重新启动编译程序,但是这类错误很少发⽣,为了安全,编译前最好还是先保存程序。
(2)错误:这个错误通常是在编译时,语法不当所引起的。
例如:括号不匹配,变量未声明等。
产⽣这类错误时,编译程序会出现报错提⽰,我们根据提⽰对源程序进⾏修改即可。
这类错误是出现最多的。
(3)警告:是指被编译程序怀疑有错,但是不确定,有时可强⾏通过。
例如:没有加void声明的主函数没有返回值,double数据被转换为float类型等。
这些警告中有些会导致错误,有些可以通过。
常规解决⽅法:此类错误⼀般程序编译系统会⾃动提⽰相应的错误地点和错误原因,⽐如哪⼀⾏代码少了个括号等诸如此类的提⽰,常见的错误,看懂直接改正即可,如果是看不懂原因,可以将错误提⽰信息输⼊搜索引擎查找⼀下,⼀般都能找到具体的解决办法。
java基础篇之异常 D
异常异常的定义在《java编程思想》中这样定义异常:阻止当前方法或作用域继续执行的问题。
虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常。
绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败。
之所以java要提出异常处理机制,就是要告诉开发人员,你的程序出现了不正常的情况,请注意。
记得当初学习java的时候,异常总是搞不太清楚,不知道这个异常是什么意思,为什么会有这个机制?但是随着知识的积累逐渐也对异常有一点感觉了。
调用抛出异常的方法,必须处理异常,有两种方式:1、使用try catch finally 捕获。
2、直接再抛出异常。
注:处理异常的方式依赖于具体业务逻辑,可灵活处理。
如果代码有异常发生,异常以后的代码将不再执行。
举一个例子来说明一下异常的用途。
public class Calculator {public int devide(int num1, int num2) {// 判断除数是否为0if (num2 == 0) {throw new IllegalArgumentException("除数不能为零");}return num1 / num2;}}看一下这个类中关于除运算的方法,如果你是新手你可能会直接返回计算结果,根本不去考虑什么参数是否正确,是否合法(当然可以原谅,谁都是这样过来的)。
但是我们应尽可能的考虑周全,把可能导致程序失败的"苗头"扼杀在摇篮中,所以进行参数的合法性检查就很有必要了。
其中执行参数检查抛出来的那个参数非法异常,这就属于这个方法的不正常情况。
正常情况下我们会正确的使用计算器,但是不排除粗心大意把除数赋值为0。
如果你之前没有考虑到这种情况,并且恰巧用户数学基础不好,那么你完了。
但是如果你之前考虑到了这种情况,那么很显然错误已在你的掌控之中。
异常案例:public class User {int id;String email;String pwd;public User() {}public User(int id, String email, String pwd) {super();this.id = id;this.email = email;this.pwd = pwd;}@Overridepublic String toString() {return id + "," + email;}@Overridepublic boolean equals(Object obj) {if (obj == null) {return false;}if (this == obj) {return true;}if (obj instanceof User) {User o = (User) obj;return id == o.id;}return false;}@Overridepublic int hashCode() {return id;}}-----------------------------------------------import java.util.HashMap;import java.util.Map;/*** 该类提供用户管理功能:注册和登录*/public class UserManager {// 存储user对象的集合,key是email,value是用户private Map<String, User> users = new HashMap<String, User>();private int id = 1;public User reg(String email, String pwd) throws UserExsitsException {if (users.containsKey(email)) {throw new UserExsitsException("该邮箱" + email + "已存在!");}User newuser = new User(id++, email, pwd);users.put(email, newuser);return newuser;}public User login(String email, String pwd) throws EmailOrPwdException {if (!users.containsKey(email)) {throw new EmailOrPwdException("无此用户!");}User u = users.get(email);if (!u.pwd.equals(pwd)) {throw new EmailOrPwdException("密码错误!");}return u;}}/*** 该类表示用户已注册过异常,一定继承于excetpion类* 用于表示注册时可能已经注册过异常*/class UserExsitsException extends Exception {public UserExsitsException(String message) {super(message);}}/*** 该类表示用户名或密码错误异常,一定继承于exception类* 用于表示输入的用户名或密码错误异常*/class EmailOrPwdException extends Exception {public EmailOrPwdException(String message) {super(message);}}----------------------------------------------------public class ExceptionDemo {public static void main(String[] args) throws Exception { UserManager mgr = new UserManager();User u = mgr.reg("java_manual@", "123abc");System.out.println("注册成功!");// 测试1,重复注册,出现异常u = mgr.reg("java_manual@", "123abc");// 测试2,登录密码错误,出现异常,密码不对u = mgr.login("java_manual@", "abc");// 测试3,登陆成功!User someone = mgr.login("java_manual@", "123abc");System.out.println(someone);}}注:代码调用抛出异常的方法,必须处理异常,有两种方式:1、使用try catch finally 捕获。
Java中的异常处理机制
Java中的异常处理机制Java是一种面向对象的编程语言,异常处理是Java编程中非常重要的一个方面。
在Java程序中,异常是指程序执行时的错误或异常状况。
如果不处理异常,则程序将终止执行并抛出一个异常。
Java语言提供了一种异常处理机制,使程序员能够有效地处理异常情况,提高程序的健壮性和可靠性。
异常处理机制可以帮助我们更好地管理程序的运行过程,提高代码的可读性和重用性。
Java异常处理机制的本质是一个异常对象的抛掷和接收机制,它由以下三个部分组成:异常的产生、异常的抛掷和异常的接收与处理。
一、异常的产生异常通常由以下几种情况产生:1. 编程人员故意或错误地抛出一个异常,如:throw new Exception("自定义异常")。
2. 运行时出现错误,如:数组越界、空指针等。
3. 系统出现异常,如:文件无法打开、网络连接中断等。
二、异常的抛掷当程序中出现异常时,有两种方式来抛出异常:1. 使用throw语句抛出异常,如:throw new Exception("自定义异常")。
2. 让系统自动抛出异常,如:空指针引用异常、除零异常等。
抛出异常后,程序会停止执行,并将异常对象抛出到调用该方法的地方。
如果该方法没有捕获异常,则该方法终止执行并将异常传递给调用该方法的下一个方法,直到异常被捕获或到达程序的顶层。
三、异常的接收与处理接收并处理异常是Java中异常处理机制的最后一步。
如果异常被捕获,程序将通过捕获异常的处理程序继续执行,而不会终止程序的执行。
Java中提供了try-catch语句块来捕获异常。
try-catch语句块的语法结构如下:try{代码块 //有可能抛出异常的代码}catch(异常类型1 异常变量名){代码块 //异常类型1的处理逻辑}catch(异常类型2 异常变量名){代码块 //异常类型2的处理逻辑}当try语句块中的代码抛出一个异常时,会跳转到匹配该异常类型的catch语句块。
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 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
java 异常处理技巧
java 异常处理技巧Java 异常处理技巧1. 异常处理的重要性•异常是程序中常见的错误情况,处理好异常可以提升程序的稳定性和可靠性。
•异常处理可以帮助我们快速定位问题,修复 bug,并改进代码质量。
2. try-catch 块•使用 try-catch 块来捕获和处理异常是一种常见的异常处理技巧。
•在 try 块中编写可能会抛出异常的代码,然后使用 catch 块来处理异常。
•catch 块可以捕获指定类型的异常,并在捕获到异常后执行相应的代码块。
3. 多个 catch 块•在处理异常时,可以使用多个 catch 块来分别捕获不同类型的异常,从而实现更精细的异常处理。
•catch 块按照从上到下的顺序进行匹配,只有第一个匹配的catch 块会执行,其它 catch 块会被忽略。
4. 异常链•在捕获异常时,有时需要同时保留原始异常的信息。
这时可以在catch 块中使用throw关键字重新抛出异常,将原始异常作为新异常的原因。
•如此一来,异常的调用栈就会记录下整个异常传递的过程,方便排查问题。
5. finally 块•finally 块是一种无论是否发生异常都会执行的代码块。
可以在finally 块中释放资源、关闭文件等操作。
•finally 块一般与 try-catch 块一起使用,确保异常处理后的清理工作得到执行。
6. 自定义异常•Java 提供了大量的异常类来满足不同的异常情况。
但是在实际开发中,有时候我们可能需要自定义异常类来满足特定的需求。
•自定义异常类可以继承自 Exception 或 RuntimeException 类,根据实际情况选择合适的父类。
•尽量精细化捕获异常,不要把所有的代码都放在一个 try-catch 块中。
•异常处理应该具有可读性和可维护性。
•在处理异常时,及时记录日志或输出错误信息,方便之后的调试和维护。
•对于不需要处理的异常,可以通过 throws 声明抛出,让调用者来处理。
Java异常处理之异常处理机制一:try-catch-finally
Java异常处理之异常处理机制⼀:try-catch-finally⼀、Java 异常处理 编写程序时,要在出现可能出现错误的时候加上检测的代码,如判断分母为0,数据为空,过多的 if-else分⽀导致程序代码加长,臃肿,可读性差,因此采⽤异常处理机制。
Java采⽤的异常处理机制,是将异常处理的程序代码集中在⼀起,与正常的程序代码分开,使得程序简洁、优雅,并易于维护。
⼆、异常处理:抓抛模型 1、抛出 Java 程序的执⾏过程中出现异常,会⽣成⼀个异常类对象,该异常对象将被提交给 Java 运⾏时系统,这个过程称为抛出(throw)异常。
⼀旦抛出对象以后,其后的代码就不再执⾏。
2、捕获、“抓” 可以理解为异常的处理⽅式:① try-catch-finally; ② throws; 3、异常对象的⽣成 (1)由虚拟机⾃动⽣成:程序运⾏过程中,虚拟机检测到程序发⽣了问题,如果在当前代码中没有找到相应的处理程序,就会在后台⾃动创建⼀个对应异常类的实例对象并抛出——⾃动抛出; (2)由开发⼈员⼿动创建:Exception exception = new ClassCastException;——创建好的异常对象不抛出对程序没有任何影响,和创建⼀个普通对象⼀样; 4、处理异常过程 (1)当程序运⾏到某⼀句时,发⽣了异常,那么程序会先停下来; (2)程序会在这句代码处,查看原因,⽣成⼀个合理“异常对象”,然后“抛”出; (3)JVM 会检测这句代码的外围,是否有 try...catch 结构,可以“捕获”它; (4)如果可以捕获,那么程序在处理完异常后,继续下⾯的运⾏,不会崩溃; (5)如果不能捕获,那么会把这个异常继续抛给“上级”,如果“上级”能处理,那么程序从“上级"处理完的代码后⾯继续运⾏; (6)如果上级也不能处理,那么继续往上抛,⼀直到达JVM,那么就“崩溃”; ①如果⼀个⽅法内抛出异常,该异常对象会被抛给调⽤者⽅法中处理。
java 异常时获取方法的入参
java 异常时获取方法的入参Java 异常时获取方法的入参在Java编程中,异常(Exception)是无法避免的一种情况。
当程序在运行过程中遇到异常情况时,会抛出异常,并在异常抛出的地方停止执行。
在异常抛出的同时,我们通常会希望能够获取到导致异常的具体原因,以便进一步处理。
在一些特定的情况下,我们还可能需要获取到导致异常的方法的入参。
本文将详细介绍如何在Java异常时获取方法的入参。
在Java中,当异常被抛出时,会生成一个异常对象。
这个异常对象包含了导致异常的原因和其他一些相关信息。
而导致异常的方法的入参则可以通过异常对象的一些方法进行获取。
下面将一步一步介绍如何获取方法的入参。
步骤一:定义自定义异常类首先,我们需要定义一个自定义的异常类,以便在方法中抛出该异常对象。
自定义异常类可以继承自Java提供的异常类,如RuntimeException。
在自定义异常类中,我们可以添加一些必要的属性和方法,用于保存方法的入参。
javapublic class MyException extends RuntimeException {private Object[] params; 方法的入参public MyException(Object... params) {this.params = params;}public Object[] getParams() {return params;}}在上述代码中,我们定义了一个自定义异常类MyException,并添加了一个params属性用于保存方法的入参。
通过构造函数将方法的入参传入并赋值给params数组。
同时,我们还提供了一个getParams方法用于获取保存的方法的入参。
步骤二:抛出异常对象在我们需要获取方法的入参时,可以通过在方法中抛出自定义的异常对象来实现。
例如:javapublic void methodWithException(int param1, String param2) { if (param1 < 0) {throw new MyException(param1, param2);}方法正常执行的逻辑}在上述代码中,如果param1的值小于0,则抛出一个自定义异常对象MyException,并传入方法的两个入参param1和param2。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
28 April 2012
异常的抛出和处理
• 异常是通过关键字 throw 抛出,程序可 抛出, 以用throw语句引发明确的异常。如: 语句引发明确的异常。 以用 语句引发明确的异常
try { if(flag<0){ throw new NullPointerException(); } }
• throw语句的操作数一定是 语句的操作数一定是Throwable类 语句的操作数一定是 类 类型或Throwable子类类型的一个对象。 子类类型的一个对象。 类型或 子类类型的一个对象
28 April 2012
使用 throw和throws 和
使用throw: 如果是在同一个方法中抛出和处 如果是在同一个方法 同一个方法中抛出和处 使用 理异常,则可以在try模块中,应用程序自己 理异常,则可以在 模块中, 模块中 判断是否有异常出现,如果有异常出现, 判断是否有异常出现,如果有异常出现,则创 建异常对象并用throw语句抛出该异常对象; 语句抛出该异常对象; 建异常对象并用 语句抛出该异常对象 在catch模块中设计用户自己希望的异常处理 模块中设计用户自己希望的异常处理 方法。 方法。 使用throws: 如果抛出和处理异常的方法不是 如果抛出和处理异常的方法不是 使用 同一个方法, 同一个方法,则要求在抛出异常的方法定义后 加如下语句: 加如下语句:throws Exception,然后把 , catch模块方法调用该方法的方法中。 模块方法调用该方法的方法中。 模块方法调用该方法的方法中
28 April 2012
嵌套的 try - catch 块
•
有时,块的一部分引起一个错误, 有时,块的一部分引起一个错误,而整个 块可能又引起另一个错误。在此情况下, 块可能又引起另一个错误。在此情况下, 需要将一个异常处理程序嵌套到另一个中。 需要将一个异常处理程序嵌套到另一个中。 在使用嵌套的try块时, 在使用嵌套的 块时,将先执行内部 try 块时 块,如果没有遇到匹配的 catch 块,则将 检查外部 try 块的 catch 块。
多个 catch 块示例
class Catch22 { public static void main(String args[]) { try { String num=args[0]; int numValue=Integer.parseInt(num); System.out.println("平方为 "+numValue*numValue); 平方为 } catch(ArrayIndexOutOfBoundsException ne) { System.out.println("未提供任何参数!"); 未提供任何参数! 未提供任何参数 } catch(NumberFormatException nb) { System.out.println("不是数字!"); 不是数字! 不是数字 输出 } 结果 } }
多个 catch 块
• •
单个代码片段可能会引起多个错误。 单个代码片段可能会引起多个错误。 块分别处理各种异常类型。 可提供多个 catch 块分别处理各种异常类型。
... try{ } catch(ArrayIndexOutOfBoundsException e){ } catch(Exception e) { } ... ArrayIndexOutOfBoundsException类为 Exception 类的子类,但是如果 类为 类的子类, 异常 属于ArrayIndexOutOfBoundsException类将执行第一个 catch 块,之后 属于 类将执行第一个 控制 将转向try/catch块之后的语句,所以始终不会执行第二个 catch 块。 块之后的语句, 将转向 块之后的语句
自行处理: 块内, 自行处理:可能引发异常的语句封入在 try 块内, 块内。 而处理异常的相应语句则封入在 catch 块内。 回避异常: 子句, 回避异常:在方法声明中包含 throws 子句,通知 潜在调用者,如果发生了异常,必须由调用者处理。 潜在调用者,如果发生了异常,必须由调用者处理。
try - catch 块示例
28 April 2012
什么是异常
• 运行时发生的错误称为异常。处理这些 运行时发生的错误称为异常。 异常就称为异常处理。 异常就称为异常处理。 • 一旦引发异常,程序将突然中止,且控 一旦引发异常,程序将突然中止, 制将返回操作系统。 制将返回操作系统。 • 发生异常后此前分配的所有资源都将保 留在相同的状态,这将导致资源漏洞。 留在相同的状态,这将导致资源漏洞。
28 April 2012
常见异常及其用途
异常 RuntimeException ArithmeticException IllegalArgumentException 说明 ng包中多数异常的基类 包中多数异常的基类 包中 算术错误, 算术错误,如除以 0 方法收到非法参数
ArrayIndexOutOfBoundsException 数组下标出界 NullPointerException SecurityException ClassNotFoundException 试图访问 null 对象引用 试图违反安全性 不能加载请求的类
28 April 2012
常见的异常及其用途
异常 AWTException IOException FileNotFoundException EOFException IllegalAccessException NoSuchMethodException InterruptedException 说明 AWT 中的异常 I/O 异常的根类 不能找到文件 文件结束 对类的访问被拒绝 请求的方法不存在 线程中断
public static void main(String args[]) 练习:说出程序执行结果 { try { Proc(0); public class exception1 Proc(1); { void Proc(int sel) throws }catch(ArrayIndexOutOfBoundsE ArithmeticException, xception e){ ArrayIndexOutOfBoundsException System.out.println("Catch"+e); { System.out.println(“In Situation"+ sel ); } } if (sel==0) { System.out.println("no Exception caught"); return; }else if(sel==1) { int iArray[]=new int[4]; iArray[10]=3; } } c:>jview throwsException In Situation 0 no Exception caught In Situation 1 Catch ng.ArrayIndexOutOfBoundsException:10
28 April 2012
JAVA异常处理方法 异常处理方法 异常处理
•
•
•
JAVA程序用 程序用try-catch(或try-catch-finally) 程序用 或 语句来抛出、捕捉和处理异常。 语句来抛出、捕捉和处理异常。 如果程序运行时出现了系统定义的异常, 如果程序运行时出现了系统定义的异常,系统 会自动抛出。此时,若程序中有try-catch语句 语句, 会自动抛出。此时,若程序中有 语句 则这些异常由系统捕捉并交给应用程序处理; 则这些异常由系统捕捉并交给应用程序处理; 若程序中没有try-catch语句,则这些异常由系 语句, 若程序中没有 语句 统捕捉和处理,此时需用到throw、throws。 、 。 统捕捉和处理,此时需用到 Java 中可用于处理异常的两种方式: 中可用于处理异常的两种方式:
class FinallyDemo { int no1,no2; FinallyDemo(String args[]) { try { no1 = Integer.parseInt(args[0]); no2 = Integer.parseInt(args[1]); System.out.println("相除结果为 "+no1/no2); 相除结果为 } catch(ArithmeticException i) { System.out.println("不能除以 0"); 不能除以 } finally { System.out.println("Finally 已执行 已执行"); } } public static void main(String args[]) { new FinallyDemo(args); } }
28 April 2012
Java异常处理基础 异常处理基础
•
Java异常处理机制采用一个统一和相对简 异常处理机制采用一个统一和相对简 单的抛出和处理错误的机制。如果一个方 单的抛出和处理错误的机制。 法本身能引发异常, 法本身能引发异常,当所调用的方法出现 异常时, 异常时,调用者可以捕获异常使之得到处 也可以回避异常, 理;也可以回避异常,这时异常将在调用 的堆栈中向下传递,直到被处理。 的堆栈中向下传递,直到被处理。
输出 结果
28 April 2012
练习: 练习: 编写Java程序 包含三种异常:算术异常 字符 程序,包含三种异常 编写 程序 包含三种异常:算术异常, 串越界,数组越界 数组越界。 串越界 数组越界。 观察输出信息:每个异常对象可以直接给出信息 观察输出信息 每个异常对象可以直接给出信息
class first_exception { public static void main(String args[]) { char c; int a,b=0; int[] array=new int[7]; String s="Hello";