黑马程序员---java基础------------------异常体系
异常:就是程序在运行时出现不正常情况。
分类:Error;Exception
异常的处理:常见的操作e.getmessage()、e.toString()、e.printStackTrace()
java 提供了特有的语句进行处理:
try {
需要被检测的代码;
} catch(异常类 变量) {
处理异常的代码;(处理方式) //这边要是有retur语句后面将不被执行
} finally {
一定会执行的语句; 当执行到System.exit(0);fianlly不会执行。
}
异常的申明:
明异常时,建议声明更为具体的异常。这样处理的可以更具体。
对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。 这里需要注意的是如果其中一个异常申明的是父类的异常(Exception e)异常,呢么它一定要放在最后面,否则的话定义的其他异常将不能被运行。
自定义异常:
异常的好处:将问题进行了封装; 将正常流程代码和问题处理代码相分离,方便与阅读。
class FuShuException extends Exception //getMessage(); { 这就是自定义了一个异常。
//private int value;
//FuShuException() {
// super();
//}
FuShuException(String msg,int value)
{ 这边是在定义异常信息,父类已经对异常信息做过处理,子类直接通过super(msg);方法获取自定义的异常信息
super(msg);
this.value = value; //这里可以把异常的数字也打印出来
}
public int getValue() {
return value;
}
}
class Demo {
int div(int a,int b)throws FuShuException { //函数内部抛出了一个自定义的异常,在函数上要申明一下
if(b<0)
throw new FuShuException("出现了除数是负数的情况------ / by fushu",b);//手动通过throw关键字抛出一个自定义异常对象。
return a/b;
}
}
class ExceptionDemo3 {
public static void main(String[] args) {
Demo d = new Demo();
try {
int x = d.div(4,-9);
System.out.println("x="+x);
} catch (FuShuException e) {
System.out.println(e.toString());
//System.out.println("除数出现负数了");
System.out.println("错误的负数是:"+e.getValue());
}
System.out.println("over");
}
}
继承Exception的原因:异常体系有一个特点,因为异常和异常对象都不抛出,他们都具备可抛性,这个可抛性是throuable这个体系中的独有特点,只有这个体系中的类和对象才可以被throw和throws操作。
throws和throw的区别:
throws使用在函数上;throw后跟的是异常对象。
throw使用在函数内;throws后面跟的异常类。可以跟多个。用逗号隔开。
RuntimeException 运行时异常
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过;如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;之所以不用在函数声
明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。
class LanPingException extends Exception {
LanPingException(String message) {
super(message);
}
}
class MaoYanException extends Exception {
MaoYanException(String message) {
super(message);
}
}
class NoPlanException extends Exception {
NoPlanException(String msg) {
super(msg);
}
}
class Computer {
private int state = 3;
public void run()throws LanPingException,MaoYanException {
if(state==2)
throw new LanPingException("蓝屏了");
if(state==3)
throw new MaoYanException("冒烟了");
System.out.println("电脑运行");
}
public void reset() {
state = 1;
System.out.println("电脑重启");
}
}
class Teacher {
private String name;
private Computer cmpt;
Teacher(String name) {
this.name = name;
cmpt = new Computer();
}
public void prelect()throws NoPlanException {
try {
cmpt.run();
} catch (LanPingException e) {
cmpt.reset();
} catch (MaoYanException e) {
test();
throw new NoPlanException("课时无法继续"+e.getMessage());
}
System.out.println("讲课");
}
public void test() {
System.out.println("练习");
}
}
class ExceptionTest
{
public static void main(String[] args)
{
Teacher t = new Teacher("毕老师");
try
{
t.prelect();
}
catch (NoPlanException e)
{
System.out.println(e.toString());
System.out.println("换老师或者放假");
}
}
}
异常在子父类中覆盖的体现:
1)子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或该异常的子类。
(父类已经有问题,子类要继承父类的功能,不能比父类更有问题,只能更优化
2)父类抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集(只要父类能处理)。
3)如果父类或接口的方法中没有抛出异常,那么子类在覆盖方法时也不可以抛出,只能try,绝对不能抛。
包(package):
对类进行分类管理;给类提供多层命名空间;写在程序第一行;类的全名是:包名.类名;包也是一种封装,建包可以将源文件和类文件分离。算是一种加密,保护
源代码被偷窥。
包与包之间可以使用的权限,只有public和protected两种。
public protected default private
同一个类中 ok ok ok ok
同一个包中 ok ok ok
子类 ok ok
不同包中 ok
导包:使用import关键字