------- android培训、java培训、期待与您交流! ----------
一.异常
异常就是程序在运行时出现不正常情况
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现。
把问题封装成对象就是异常
对于问题的划分:两种:一种是严重的问题,一种是非严重的问题
对于严重的,java通过Error类进行描述
对于Error一般不编写针对性的代码对其进行处理
对于非严重的,java通过Exception类进行描述
对于Exception可以使用针对性的处理方法进行处理
异常的处理
java提供了特有的语句进行处理
try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的语句;
}
例子
class Demo
{
intdiv(int a, int b)
{
returna/b;
}
}
class ExceptionDemo
{
publicstatic void main(String[] args)
{
Demod = new Demo();
try
{
intx =d.div(4,0); //此处如果执行错误,就会执行catch,如果无误,则照常执行
System.out.println("x="+x);
}
catch(Exception e)//Exception e =new AritchmeticException();多态
{
System.out.println("除零错误啦");
}
System.out.println("over");
}
}
结果
除零错误啦
Over
当try处4/0时(数字不能除以零),出错,java虚拟机识别,产生了AritchmeticException,并把这个问题封装成了一个对象newAritchmeticException(),抛给了调用这个功能的调用者(上例中是主函数在调用)。然后try检测到了这个对象后,把它丢给了catch。catch通过定义的参数接收。上例中就变成了Exception e =new AritchmeticException();,然后执行了处理代码。
就好比老师上课中,手破了,本来不能上课了,贴了一个创口贴(try catch),就可以继续上课
对捕获到的异常对象进行常见方法操作
String getMessage():获取异常信息
在上例中除零错误啦后面添加一句
System.out.println(e.getMessage());
结果/ by zero
toString(): 异常名称: 异常信息
printStackTrace(): 异常名称,异常信息,异常出现的位置
其实jvm默认的异常处理机制,就是在调用printStackTrace方法,
打印异常的堆栈的跟踪信息
throws
上例中
class Demo
{
intdiv(int a, int b)throws Exception
{
returna/b;
}
}
throws Exception 意思是说:在功能上通过throws的关键字声明了该功能有可能会出现问题。
在函数上声明异常,便于提高安全性,让调用出进行处理。不处理编译失败
(比如知道地上某处埋着个炸弹,声明异常就是在炸弹处标示一下,要进行处理,不处理就可能会爆炸)
对多异常的处理
1、声明异常时,建议声明更为具体的异常,这样处理额可以更具体。
如 throws ArithmeticException,ArrayIndexOutOfBoundsException
声明几个异常,就要写几个catch
如
catch(ArithmeticException e)
{}
catch(ArrayIndexOutOfBoundsException e)
{}
2、对方声明几个异常,就对应有几个catch块。不要定义多余的catch块
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面
建议在进行catch处理时,catch中一定要定义具体处理方式
不要简单定义一句e.printStackTrace(),
也不要简单的就书写一条输出语句
自定义异常
自定义的问题描述成为自定义异常
注意:如果让一个类成为异常类,必须要继承异常体系,因为只有成为异常体系的子类才有资格具有可抛性。才可以被两个关键字所操作,throws,throw
如
class FuShuIndexException extendsException
{
FuShuIndexException()
{}
}
自定义异常时,要么继承Exception,要么继承RuntimeException
异常的分类
1、编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系
这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方法。
这样的问题都可以针对性的处理
2、编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类
这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的,或者引发了内部状态的改变导致的。
那么这种问题一般不处理,直接编译通过,让调用者调用时的程序强制停止,让调用者对代码进行修正。
throws和throw区别
1、throws使用在函数上
throw使用在函数内
2、throws抛出的是异常类,可以抛出多个,用逗号隔开
throw抛出的是异常对象
try catch的三种格式
1、
try
{}
catch() //多个 当没有必要资源需要释放时,可以不用定义fianlly
{}
2、
try
{}
catch()
{}
finally
{}
3、异常无法直接catch处理,但是资源需要关闭
try
{
//开启资源
thrownew Exception();
}
finally
{
//关闭资源
}
异常处理的原则
1、函数内部如果抛出需要检测的异常,那么函数上必须声明
否则必须在函数内用try catch捕捉,否则编译失败
2、如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败
3、什么时候catch,什么时候throws呢?
功能内部能够解决,用catch
解决不了,用throws告诉调用者,由调用者解决
4、一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性处理。
内部有几个需要检测的异常,就抛出几个异常,抛出几个就catch几个
异常的注意事项
1、子类在覆盖父类方法时,父类的方法如果抛出了异常,
那么子类的方法只能抛出父类的异常或者该异常的子类(或不抛)
2、如果父类抛出多个异常,那么子类只能抛父类的子集
简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。
注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,只能try。
二.包
包的作用:
区分相同名字的类
良好的管理大量的类
控制访问范围
打包命令:
package com.name
命名规范:
小写字母
1、包的声明
为了声明一个包,首先必须建立一个相应的目录结构,子目录与包名一致。然后在需要放入该包的类文件开头声明包,形式为:
package 包名;
这样,在这个类文件中定义的所有类就都被装入到您所希望的包中了,例如:
package bookexample; class A{ …… }class B extends A{ …… } public class OverrideExample{ …… }
不同的程序文件内的类也可以同属于一个包,只要在这些程序文件前都加上同一个包的说明即可。
2、包的使用
在Java中,为了装载使用已编译好的包,通常可使用以下3种方法:
(1)在要引用的类名前带上包名作为修饰符。例如:
bookexample.A objA =new bookexample.A();
其中bookexample是包名,A是包中的类名,objA是类的对象。
(2)在文件开头使用import引用包中的类。例如:
import bookexample.A; class Example{ AobjA = new A(); }
同样,bookexample是包名,A是包中的类,objA是创建的A类对象。
(3)在文件前使用import引用整个包。例如:
import bookexample.*; class Example{ AobjA=new A(); }
bookexample整个包被引入,A是包中的类,objA是创建的A类对象。
在使用包时,可以用点“.”表示出包所在的层次结构,用“.*”表示该目录结构下的所有内容。
需要指出的是,java.lang这个包无需显式引用,它总是被编译器自动调入。使用包时还要特别注意系统classpath路径的设置情况,它需要将包名对应目录的父目录包含在classpath路径中,否则编译时会出错,提示用户编译器找不到指定的类。
包与包之间的类进行访问:
被访问的包中的类必须是public,
被访问的包中的类方法也必须是public
同一类中 | 同一包中 | 子类中 | 不同包中 | |
公共 public | √ | √ | √ | √ |
保护 protected | √ | √ | √ | × |
default(什么不写,默认权限) | √ | √ | √ | × |
私有 private | √ | × | × | × |
protected/*保护,也是一种封装*/这种权限只有不同包中的子类(必须要继承)可以使用。直接创建对象不行
简化包写法用导入
导包的原则:用到哪个类,就导入哪个类
import packa.DemoA; //导入packa包中的DemoA类
import packa.*;//导入了packa包中所有的类
Jar包可以直接设置classpath
如classpath =./xxx.jar //.就是当前目录