《Java编程异常处理.ppt》由会员分享,可在线阅读,更多相关《Java编程异常处理.ppt(84页珍藏版)》请在三一办公上搜索。
1、第六章 异常 1.异常的概念 2.异常处理的方法 3.java的异常类 4.异常处理 5.自定义异常的实现6.断言,1.异常的概念 由于硬件错误,资源耗尽以及输入错误的数据等,都可能导致程序运行时异常的产生.异常是运行时的错误.异常产生时会中断指令的正常执行.java异常是java提供的用于处理程序中错误的一种机制.所谓错误是在程序的运行过程中产生的一些异常事件.如:除0,数组下标越界,所要读取的文件不存在等.设计良好的程序都应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果,保障程序的键壮性.对于异常首先应该预计到所有可能出现的情况,然后考虑能否完全
2、避免异常.如果不能完全避免再考虑异常发生时的具体处理办法.java程序在执行过程中如出现异常事件,可以生成一个异常对象,该异常对象封装了异常的信息。并提交给java运行时环境,这个过程称为抛出(throw)异常,当java运行时环境接收到异常对象时,会寻找能处理这一异常对象的代码,并把当前异常对象交给其处理,这一过程称为捕获(catch)异常.,java默认处理异常的方式为直接把异常对象包装的信息打印到命令行上.当异常发生时注意观察错误的名字和行号.1.public class FirstException2.3.public static void main(String args)4.in
3、t a=2/0;5.System.out.println(a=+a);6.7.1.public class TestException2.3.public static void main(String args)4.int arr=1,2.,3;5.System.out.println(arr3);6.7.运行上面的程序看也java也错的机制.,2.异常处理的方法当异常发生时,有两种处理方式:a.捕获 b.异常抛出a.捕获.try-catch当异常发生时,通过异常的捕获可以来对发生的异常进行处理.try-catch方法:try可能出现异常的代码catch(异常类型1 异常引用)异常类型1的处
4、理代码.catch(异常类型n 异常引用)异常类型n的处理代码,注:1.try语句只能有一个,而catch语句块则可以有任意多个.catch语句块紧跟在try语句块之后,而且catch语句块必须相互紧跟,它们之间不能有任何代码.2.当在try语句块中发生异常时,程序将停止继续往下执行.系统会把它封装成一个异常类对象,并把它交给catch语句块(进入语句块)相对应的异常类型的异常引用进行处理.如果没有异常发生,程序正常运行不会进入任何一个catch语句块.b.异常抛出.不是所有异常在其产生的位置都能立即进行处理(没有捕获到或处理不了)异常抛出分为:显性再抛出和隐性再抛出将catch语句捕获的异常
5、再次抛出,称为显性再抛出.如果只想把收到的异常再抛出,不必使用显性再抛出,使用隐性再抛出,只要在方法后用throws语句,方法内不用处理任何异常.,两者异同:1.)若抛出的是捕获异常,隐性与显性再抛出都必须在方法声明中明确声明.2.)显性再抛出是在方法体中使用throw语句将产生的异常抛出.3.)隐性再抛出是在方法体中没有任何抛出异常的语句,若产生异常将自动抛出.3.java的异常类 java类库中有一个java.lang.Throwable类,是所有异常类的超类.Throwable类有两个直接子类,Error与Exception类,Exception类有一个子类RuntimeExceptio
6、n.其中Exception类的直接或间接子类,除去RuntimException类的直接或间接子类,称为捕获异常(必须处理的异常),其他的都为未捕获异常.ThrowableError Exception.(未捕获异常)RuntimeException.(捕获异常).(未捕获异常),a.捕获异常(必须处理的异常)捕获异常一般是由外界因素产生的,即使程序本身没有问题,也有可能产生(也可能恢复),在开发时必须考虑如何处理,否则编译不通过.b.未捕获异常(不用处理的异常)除了捕获异常以外的部分都是未捕获异常,即Error类及其子类以及RuntimeException类及其子类.继承自Error的类一般
7、代表由硬件运行失败导致的严重错误,而其从严格意义上讲,不属于异常,一般来讲,程序不能从Error中恢复。而RuntimeException类的子类通常是指一些程序运行时错误引起的异常,所以也可以不对其进行处理.,4.异常处理 4.1 try-catch1.public class FirstException 2.3.public static void main(String args)4.5.try6.int a=2/0;7.System.out.println(a=+a);8.int ar=null;9.System.out.println(ar.length);10.catch(Ari
8、thmeticException ae)11.ae.printStackTrace();12.catch(NullPointerException np)13.np.printStackTrace();14.catch(Exception e)15.e.printStackTrace();16.17.18.,1.import.*;2.import java.io.*;3.public class CatchException4.5.public static void main(String args)6.7.try8.ServerSocket ss=new ServerSocket(8888
9、);9.int i=2/0;10.catch(Exception ie)11.ie.printStackTrace();12.13.14.,4.2 try-catch-finally1.public class TestFinally 2.3.public static int get()4.try5.int a=2/0;6.System.out.println(try语句);7.return 1;8.catch(Exception e)9.e.printStackTrace();10.System.out.println(catch语句);11.return 2;12.finally13.S
10、ystem.out.println(finally语句);14.return 3;15.16./System.out.println(try-catch外语句);17.18.19.public static void main(String args)20.21.System.out.println(get();22.23.,4.3 throw/throws1.public class ThrowException 2.3.public static void c()4.int a=new int3;5.a8=12;6.7.8.public static void b()9.c();10.11
11、.12.public static void a()13.try14.b();15.catch(ArrayIndexOutOfBoundsException ai)16.ai.printStackTrace();17.18.19.,20.public static void main(String args)21.22.a();23.System.out.println(程序正常执行!);24.25.1.public class ThrowException12.3.public static void b()throws ArrayIndexOutOfBoundsException4.try
12、5.int a=new int3;6.a8=12;7.catch(ArrayIndexOutOfBoundsException ai)8.throw ai;/显性抛出异常9.10.11.,12.public static void a()13.try14.b();15.catch(RuntimeException re)16.re.printStackTrace();17.18.19.20.public static void main(String args)21.22.a();23.System.out.println(程序正常执行!);24.25.,1./如果只是想把收到的异常再抛出,不
13、必使用显性再抛出,使用2./隐性再抛出(比显性再抛出简单,效果是相同的)3./对于捕获异常,显性和隐性都必须在方法声明中明确声明4./显性再抛出,用throw语句,隐性再抛出方法体中没有任何抛出异常的语句5./产生的异常自动抛出6.import.*;7.import java.io.*;8.9.public class ThrowException2 10.11.public static void myFunction()throws IOException12.ServerSocket ss=new ServerSocket(8888);13.14.,15.public static vo
14、id main(String args)16.17.try18.19.myFunction();20.21.catch(IOException e)22.23.e.printStackTrace();24.25.System.out.println(程序正常运行结束!);26.27.,1./方法重写,要求重写后的方法一定不能声明抛出新的捕获异常或比原方法范畴更广的捕获异常2.class Father 3.4.public void myFunction()throws Exception5.System.out.println(父类抛出exception异常);6.7.8.9.class So
15、n extends Father10.11.public void myFunction()throws InterruptedException12.int a=null;13.System.out.println(a.length);14.System.out.println(子类抛出interruptedException);15.16.17.,18.public class OverWriteException19.20.public static void main(String args)throws Exception21.Father f=new Son();22.f.myFu
16、nction();23.24.5.自定义异常的实现1./自定义的异常可以继承自exception或其它的捕获异常类2.class AgeException extends Exception3.4.public AgeException()5.6.public AgeException(String msg)7.super(msg);8.9.10.,11.public class Person12.13.private int age;14.15.public int getAge()16.return this.age;17.18.19.public void setAge(int age)
17、throws AgeException20.if(age=0)21.throw new AgeException(年龄不能小于等于零!);,22.else23.this.age=age;24.25.26.27.public static void main(String args)28.Person p=new Person();29.try30.p.setAge(100);31.catch(Exception ae)32.ae.printStackTrace();33.34.35.,6.断言 断言其设计初衷是为程序的开发与测试提供方便,在程序的测试过程中验证程序本身逻辑的正确性.Assert
18、 逻辑表达式:”xxxx”;1./assert后的逻辑表达式为True执行后面的语句2./为False不会执行后面语句,会抛出AssertionError异常,同时会打印3./信息表达式的值4./J2SE1.4以前是没有断言的5./java-ea 文件名6./ea表示enableassertions7.public class TestAssert 8.9./*,10.public int myFunction(int i)11.if(i0)12.System.out.println(程序逻辑出错,该值应该为正数!);13.return null;14.else15.return new in
19、ti;16.17.18.*/19.,20.public int myFunction(int i)21.assert(i0):程序逻辑出错,该值应该为正数!;22.return new inti;23.24.25.public static void main(String args)26.27.TestAssert t=new TestAssert();28.t.myFunction(-10);29.30.,第七章 java.lang包 1.java.lang包简介 2.封装类 3.String/StringBuffer4.Math 5.Object 6.System,1.java.lang
20、包简介 java.lang包是java最广泛使用的包,它会被系统自动导入到所有的程序中.2.封装类 为什么引用封装类:基本数据类型与对象之间是截然不同的,不能将基本数据类型的数据当作对象进行处理。但在很多情况下希望将基本数据类型数据当作对象使用.封装类对象永不可变,不能被继承.封装类提供以下两个方面的功能:a.将基本数据类型封装后当作对象进行操作.b.为基本数据类型提供各种转换功能.,基本数据类型与封装类基本类型 封装器类 构造器boolean Boolean Boolean(String s)或Boolean(boolean value)byte Byte Byte(String s)或者B
21、yte(byte value)char Character Character(char value)short Short Short(String s)或者Short(short value)int Integer Integer(String s)或者Integer(int value)long Long Long(String s)或者Long(long value)float Float Float(String s)、Float(float value)或者Float(double value)double Double Double(String s)或者Double(doubl
22、e value),数据转换功能:基本数据类型值转换为字符串:1.非静态转换方法:无参toString()2.静态转换方法:有参静态toString方法.静态转换字符串方法:静态方法 Boolean Byte Character Short Integer Long Float DoubletoString(xxx)有 有 有 有 有 有 有 有toString(xxx,sss)有 有toBinaryString(xxx)有 有toOctalString(xxx)有 有toHexString(xxx)有 有 有 有,字符串转换为基本数据类型值:1.非静态转换方法:xxxValue系列方法 2.静
23、态转换方法:parsexxx方法xxxValue方法:方法 Boolean Byte Character Short Integer Long Float DoublebyteValue 有 有 有 有 有 有 shortValue 有 有 有 有 有 有intValue 有 有 有 有 有 有longValue 有 有 有 有 有 有floatValue 有 有 有 有 有 有doubleValue 有 有 有 有 有 有booleanValue 有 charValue 有,静态parseXXX方法:静态方法 Boolean Byte Character Short Integer Long
24、 Float Double parseXXX(String s)有 有 有 有 有 有 有 parseXXX(String s,int i)有 有 有 有 其化常用方法:1.静态工厂方法:除了new创建封装类外,还可以用静态工厂方法valueOf,valueOf静态工厂方法:方法 Boolean Byte Character Short Integer Long Float DoublevalueOf(xxx)有 有 有 有 有 有 有 有valueOf(String s)有 有 有 有 有 有 有valueOf(String s,int i)有 有 有 有,自动打包:可以直接将基本数据类型的
25、值当作封装类对象使用.1.public class TestPacket2.static void show(Integer i)3.System.out.println(接收Ingeter封装对象的数值为:+i.toString();4.5.public static void main(String args)6.show(1000);/show(new Integer(1000);7.8.,自动解包:可以直接将封装对象赋值给基本的数据类型的变量.1.public class TestWiz2.public static void main(string args)3.Integer x=
26、new Integer(1000);4.int i=x+500;/int i=x.intValue()+500;5.();6.7.,3.String/StringBufferA.String类a.字符串的创建:1.String str=xxx;2.String str=new String(参数列表);1.public class TestString2.public static void main(String args)3.String s1=core java;/字符串简单创建方式4.String s2=new String(core java);/标准new创建方式5.String
27、s3=;/也是一个字符串,只是字符串没有内容.6.String s4=null;/null代表没有对象7.System.out.println(s1+*+s2+*+S3+*+s4);8.9.,b.常用构造器public String(byte bytes)public String(byte bytes,int offset,int length)public String(byte bytes,Stirng charsetName)throws UnsupportedEncodingExceptionpublic String(char value)public String(char va
28、lue,int offset,int count)public String(String original)public String(StringBuffer buffer),1.public class TestStringConstructor2.public static void main(String args)3.String s1=java核心技术大全;4.String s2=new String(s1.getBytes(),iso8859_1);5.System.out.println(将s1转换为iso8895_1编码格式,结果为:+s2);6.String s3=new
29、 String(s2.getBytes(iso8859_1),gb2312);7.System.out.println(将s1再转换为gb2312编码格式,结果为:+s3);8.9.,c.重要方法:public char charAt(int index)public byte getBytes()public byte getBytes(String charsetName)throws UnsupportedEncodingExceptionpublic boolean equals(Object anObject)public boolean equalsIgnoreCase(Strin
30、g anotherString)public boolean endsWith(String suffix)public int indexOf(int ch)public int indexOf(String str)public String substring(int beginIndex),public String substring(int beginIndex,int endIndex)public String concat(String str)public String replace(char oldChar,char newChar)public String repl
31、ace(CharSequence target,CharSequence replacement)public String split(String regex)public String trim()public String toString()public char toCharArray()public static String valueOf(参数列表),1.public class TString 2.3.public static void main(String args)throws Exception4.5.String ss=java core_java;6.char
32、 c=ss.charAt(3);7.System.out.println(c);8.String re=ss.concat(.java);9.System.out.println(re);/java core_java.java10.boolean bo=re.endsWith(.java);11.System.out.println(bo);12.byte by=re.getBytes();13.int i=re.indexOf(a);,14.System.out.println(i);15.int ii=re.indexOf(core);16.System.out.println(ii);
33、17.String sr=re.replace(a,b);18.System.out.println(sr);19.String sa=re.split(.);20.for(String obj:sa)21.System.out.println(obj);22.23.String sub=re.substring(6,10);24.System.out.println(sub);25.String st=re.trim();26.System.out.println(st);27.String sd=String.valueOf(26.5);28.System.out.println(sd);
34、29.30.,d.String对象的内存机制1.public class TestString 2.3.4.public static void main(String args)5.6.String s1=Java编程;/1.简单的创建字符串对象7.String s2=Java编程;8.String s3=new String(Java编程);/2.调用相应的构造器创建对象9.if(s1=s2)10.System.out.println(字符串s1和s2通过等于测试,结果返回True);11.12.else,13.System.out.println(字符串s1和s2通过等于测试,结果返回F
35、alse);14.15.if(s1=s3)16.System.out.println(字符串s1和s3通过等于测试,结果返回True);17.18.else19.System.out.println(字符串s1和s3通过等于测试,结果返回False);20.21.if(s1.equals(s3)22.System.out.println(字符串s1和s2内容相同,结果返回True);23.,24.else25.System.out.println(字符串s1和s2内容不相同,结果返回False);26.27.28.,用简单方式创建的字符串放在池中,如果再次用简单方式创建任何已在池中存在的字符串
36、,将不会再在池中分配空间,而是让新的对象的引用指向池中已存在的字符串。new出来的字符串先在堆中开辟一块空间,然后再到池中去找看有没有相同的一个字符串,如果没有相同的字符串,也会在池中创建一个同样的字符串,并会把两者联系起来。若存也会把两者联系起来。String特殊机制让我们比较字符串时,不管字符串有多长,其比较速度都是一样的,国为在比较两个字符串内容是否相时,不必真去考察内容,只需比较两个字符串联系的常量池中对象是否为同一个即可.String类对象永不可变,在一些需要大量连接字符串的代码中,其性能将大幅下降.,B.StringBuffer类为了弥补String在连接操作中的缺点,java提供
37、了一个StringBuffer类StringBuffer对象的创建语法只有一种.使用new操作符StringBuffer类的构造器:public StringBuffer()public StringBuffer(String str)StringBuffer类的重要方法:public StringBuffer append(String str)public StringBuffer insert(int offset,String str)public StringBuffer delete(int start,int end)public StringBuffer reverse()pu
38、blic String toString()StringBuffer类也有equals方法,但是其功能相当于将两个引用进行“=”比较,4.Math类Math类提供了很多数学计算的方法,这些方法都是静态的方法.常用方法:public static double sin(double a)public static double cos(double a)public static double pow(double a,double b)public static double sqrt(double a)public staic int abs(int a)public static doub
39、le ceil(double a)public static double floor(double a)public static long max(long a,long b)public static int min(int a),5.Object类Object类是所有类的父类,java中的类都是直接或间接继承自Object类1.public class MyInteger 2.3.private final int value;4.5.public MyInteger(int value)6.this.value=value;7.8.9.public int getValue()10.
40、return this.value;11.12.,13.public boolean equals(Object obj)14.if(obj=null)15.return false;16.if(obj instanceof MyInteger)17.return value=(MyInteger)obj).getValue();18.19.else 20.return false;21.22.23.public int hashCode()24.return Integer.valueOf(this.value).hashCode()+37;25.26.,27.public String t
41、oString()28.return+this.value;29.30.31.public static void main(String args)32.33.MyInteger m1=new MyInteger(10);34.MyInteger m2=new MyInteger(10);35.System.out.println(m1);36.System.out.println(m1.equals(m2);37.38.,6.System类重要字段:public static final InputStream inpublic static final PrintStream out重要
42、方法:arraycopy(Object src,int srcPos,Object dest,int destPos,int length)exit(int status)public static void setErr(PrintStream err)public static void setIn(InputStream in)public static void setOut(PrintStream out),第八章 java.util包1.Random 2.Date/Calendar 3.DateFormat/SimpleDateFormat 4.Date/Time/TimeStam
43、p 5.集合框架,1.Random类Random类的对象用来产生随机数a.构造方法:public Random()public Random(long seed)b.常用方法:public boolean nextBoolean()public int nextInt()public int nextInt(int n)public long nextLong()public float nextFloat()public double nextDouble(),1.import java.util.Random;2.public class TestRandom 3.4.public sta
44、tic void main(String args)5.6.Random r1=new Random();7.System.out.println(r1.nextInt();8.System.out.println(r1.nextInt();9.Random r2=new Random(10);10.System.out.println(r2.nextInt();11.System.out.println(r2.nextInt();12.13.,2.Date/CalendarA.Date类a.常用构造方法:public Date(int year,int month,int date)publ
45、ic Date(int year,int month,int date,int hrs,int min,int sec)b.常用方法:public int getYear()public int getMonth()public int getDate()public int getHours()public int getMinutes()public int getSeconds(),B.Calendar类Calendar类没有提供可以直接使用的构造器,我们用其提供的静态方法getInstance()来得到一个Calendar实例.常用方法:public int get(int field
46、)public static Calendar getInstance()public final Date getTime()public TimeZone getTimeZone()public final void set(int year,int month,int date)public final void setTime(Date date)public void setTimeZone(TimeZone value),3.DateFormat/SimpleDateFormat(java.text)DateFormat为日期格式化的抽象类,它以与语言无关的方式格式化并分析日期或时
47、间.DateFormat类的重要方法:public final String format(Date date)public Calendar getCalendar()public static final DateFormat getDateInstance()SimpleDateFormat类是DateFormat类的实现类.是一个以与语言环境相关的方式来格式化和分析日期的具体类.,SimpleDateFormat类的重要构造方法:public SimpleDateFormat(String pattern)其中参数patter可以按以下格式来做:日期和时间模式 结果,4.Date/Ti
48、me/TimeStamp(java.sql)略.Date/Calendar/DateFormat/SimpleDateFormat/Date/Time/TimeStamp举例:1.import java.util.*;2.import java.text.*;3.import java.sql.Time;4.import java.sql.Timestamp;5.public class TestDate 6.7.public static void main(String args)8.9.,10.Date d=new Date();11./Date d=new Date(108,4,27)
49、;12./System.out.println(d);13.int iDate=d.getDate();14.int iMonth=d.getMonth()+1;15./System.out.println(iYear+年+iMonth+月+iDate+日);16./d.setYear(109);17./System.out.println(d);18.String s=d.toGMTString();19./System.out.println(s);20.,21.DateFormat sdf=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);22./Sys
50、tem.out.println(sdf.format(d);23.24.Calendar c=Calendar.getInstance();25./int year=c.get(Calendar.YEAR);26./System.out.println(c);27.c.add(Calendar.YEAR,2);28./System.out.println(c.get(Calendar.YEAR);29.c.setTime(d);30.,/System.out.println(c.get(Calendar.YEAR)+年+c.get(Calendar.MONTH)+月+c.get(Calenda