Java基础异常处理.docx
《Java基础异常处理.docx》由会员分享,可在线阅读,更多相关《Java基础异常处理.docx(7页珍藏版)》请在冰豆网上搜索。
Java基础异常处理
Java异常处理
异常:
程序运行时发生的非正常情况
发生异常程序意外终止,控制权返回给调用者
Java的异常类:
Throwable(java异常的根类)
―Error系统级错误一般不能恢复
―Exception程序的实现过程中的异常
运行时异常指在程序运行中不一定要扑获的异常
比如:
NullPointerException
ArrayIndexOutOfBoundsException
ArithmeticException
非运行时异常:
指程序运行中一定要扑获的异常
比如:
SQLException
IOException
ClassNotFoundException
publicclassTestException{
publicinttestException(inta,intb){
intarr[]={1,5,3,8};
try{
System.out.println(arr[6]);
returna/b;
}catch(ArithmeticExceptione){
System.out.println("分母不能为零\n"+e.toString());
return-1;
}catch(ArrayIndexOutOfBoundsExceptionae){
ae.printStackTrace();//打印错误堆栈信息
System.out.println("数组下标越界");
return-1;
}catch(Exceptionex){
System.out.println("我的任务是扑获前面的catch没有扑获的异常");
return-1;
}finally{
System.out.println("我是无论如何都要执行的代码");
}
}
publicstaticvoidmain(String[]args){
TestExceptiontest=newTestException();
intresult=test.testException(8,0);
if(result>-1){
System.out.println("运行正常结果:
"+result);
}else{
System.out.println("出现异常");
}
System.out.println("程序往下执行");
}
}
使用多重catch子句要注意:
在前面的异常级别不能大于后者
finally是异常处理语句结构的一部分,表示无论什么情况都要执行的模块
finally语句的主要作用是在try或catch转到其他部分前做的一些“善后”工作。
比如:
关闭打开的文件,释放链接、内存等系统资源。
throw关键字
用来抛出一个异常。
程序会在throw语句后立即终止
staticvoidtest(){
try{
thrownewNullPointerException("抛出空指针异常");//抛出一个异常
}catch(NullPointerExceptione){
System.out.println("扑获空指针异常");
throwe;//再次抛出此异常
}
}
publicstaticvoidmain(String[]args){
try{
test();
}catch(NullPointerExceptione){
System.out.println("扑获"+e);
}
}
throws关键字
throws标明方法中可能抛出的各种异常
但不处理它,即回避此异常,而交给调用者处理
publicclassTestExce{
publicstaticvoidmain(String[]args){
TestExtest=newTestEx();
try{
test.get(1,0);
}catch(Exceptione){
e.printStackTrace();
}
}
}
classTestEx{
publicvoidget(inta,intb)throwsException{
intc=a/b;
System.out.println("这个方法可能会产生异常,请调用者处理"+c);
}
}
自定义异常
publicclassTestMyException{
publicvoidtestMyException(intval)throwsMyException{
if(val<0){
thrownewMyException("出现异常,参数不能小于零");
}else{
System.out.println(val);
}
}
publicstaticvoidmain(String[]args){
TestMyExceptiontest=newTestMyException();
try{
test.testMyException
(1);
}catch(MyExceptione){
System.out.println(e.getMsg());
}
}
}
classMyExceptionextendsException{
privateStringmsg;
publicMyException(Stringmsg){
this.msg=msg;
}
publicStringgetMsg(){
returnthis.msg;
}
}
垃圾回收GC
在程序的运行时环境中,Java虚拟机提供了一个系统级的垃圾回收器线程,
它负责自动回收那些无用对象所占用的内存
垃圾回收具有以下特点
1.只有当对象不再被程序中的任何引用变量引用时,它的内存才可能被回收。
2.程序无法迫使垃圾回收器立即执行垃圾回收操作。
3.当垃圾回收器将要回收无用对象的内存时,先调用该对象的finalize()方法,
通常不使用原因你不确定什么时候执行此方法甚至是否会执行此方法
以下两个方法作用相同
System.gc();//运行垃圾回收器
Runtime.getRuntime().gc();
publicclassTestGC{
@SuppressWarnings("unused")
publicstaticvoidtestMyFinalize(){
MyFinalizemyFinalize=newMyFinalize();
System.out.println("对象被创建");
myFinalize=null;
System.gc();
System.runFinalization();
//JVM退出时为还未执行finalize()的对象执行finalize()
System.out.println("对象被回收");
}
publicstaticvoidtestMemory(){
Runtimert=Runtime.getRuntime();
System.out.printf
("JVM为对象分配总内存空间:
%d%n",rt.totalMemory());
System.out.printf
("JVM中对象可以使用的剩余内存空间:
%d%n",rt.freeMemory());
Object[]objs=newObject[20000];
for(inti=0;iObjectobj=newObject();
objs[i]=obj;
}
System.out.printf
("产生大量的对象后可以使用的剩余内存:
%d%n",rt.freeMemory());
objs=null;
rt.gc();
rt.runFinalization();
System.out.printf
("回收对象后后可以使用的剩余内存:
%d%n",rt.freeMemory());
System.out.printf("总内存:
%d%n",rt.totalMemory());
}
publicstaticvoidmain(String[]args){
//testMyFinalize();
testMemory();
}
}
classMyFinalize{
@Override
protectedvoidfinalize()throwsThrowable{
System.out.println
("调用finalize()的对象的内存地址哈希码值:
"+this.hashCode());
}
}
作业:
1.编写一个类,在main()方法中的try块中抛出Exception异常。
传递一个字符串参数给Exception的构造器,在catch中扑获此异常,并打印此字符串参数,添加finally子句,打印消息以证明finally中代码得到执行
2.编写一个自定义异常,定义一个接受字符串参数的构造方法,把此字符串保存在属性中并定义一个获取此字符串的方法,写一个try–catch进行测试
3.定义一个对象引用并初始化为null,在try-catch中尝试用此引用调用方法