该博文是传智播客Java基础视频的学习笔记,仅为个人学习笔记,谢谢
异常发生在运行时,在Java中,用类的形式对不正常的情况进行了描述和封装,描述不正常情况的类,就称为异常类,异常类的出现,将正常流程代码和问题处理代码分离,提高了阅读性。异常分为两大类,
Throwable:
|-- 不可处理error的
|-- 可处理的exception
exception分两类:
1、编译时被检测异常:除了runtimeException都是,这种问题希望在编译过程中就进行针对性的处理
2、运行时异常:runtimeException及其子类,这种问题一旦发生,程序就无法运行,更多是由于调用者导致的或者引发了内部状态的改变而导致的,这种问题一般不处理,编译直接通过,运行时强制停止,runtimeException是那些可能在JVM正常运行期间抛出的异常的超类,可能在执行期间抛出但未被捕获的任何runtimeException的子类都无需在throws语句中进行声明
自定义异常,要么继承exception,要么继承runtimeException
处理异常的具体格式:
try{
//需要被检测的代码
}catch(异常类 变量//用于接收发生的异常对象){
//处理异常的代码
}
finally{
//一定会被执行的代码
}
常用的方法:getMessage();toString();
printStachTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法,打印异常的堆栈信息,该方法有如下重载形式:printStackTrace(PrintStream s),将信息输出到指定的输出流,但不常用,可以用log4j替代
如果函数中throw了多个异常,如果要throws的话,需要全部声明(除了runtimeException),catch时需要分开写,但是要把父类exception的catch写在最后边,否则编译失败
异常处理的原则:
1、函数内部如果抛出需要检测的异常,那么函数上必须要声明,否则必须在函数内用try catch捕捉,否则编译失败
2、如果调用到了声明异常的函数,要么trycatch,要么throws,否则编译失败
3、一个功能如果抛出了多个异常,那么调用时必须对应多个catch进行针对性的处理,内部有几个需要检测的异常,就抛几个,抛出几个,就catch几个
即使catch语句中写了return语句,finally也是会被执行的,但如果catch语句中写了System.exit(0);//退出jvm
finally中的语句就执行不到了。
try catch finally常见的组合方式:
1、try catch finally
2、try catch(多个)当没有必须要执行的代码时,可以不用定义finally
3、try finally:
void show()throws Exception
{
try{
throw new Exception();
}
finally{
//当出现异常时,不一定需要在本方法内进行处理,但有一些必须要执行的操作
}
}
异常的转换,或叫异常的封装:
class NoAddException extends Exception{}
void addData()throws NoAddException{
连接数据库
try{
添加数据,出现异常SQLException
}
catch(SQLException e){
处理SQLException
throw new NoAddException();
}
finally{
关闭数据库
}
}
异常的注意事项:
1、子类在覆盖父类方法时,如果父类的方法抛出了方法,那么子类的方法只能抛出父类方法抛出的异常或者父类方法抛出的异常的子类,或者不抛
2、如果父类抛出多个异常,子类只能抛出父类异常或其子集,如果父类方法没有抛异常,那么子类覆盖时绝对不能抛,如果子类在覆盖时确实遇到异常了,那么只能try。
Object类的常用方法:
equals(Object obj):比较两个对象是否相等,Object中equals方法的定义为:return(this==obj);比较的是两个对象的地址是否相同,但这并没有太大的意义,在使用过程中,一般都会覆盖此方法,根据对象的特有内容,建立特有的判断依据。
hashCode():获取一个对象的哈希值
Person p = new Person();
sop(p);sop(p.hashCode());
equals,hashcode,==,这三个的区别,待补充
getClass():返回此object的运行时类,获取对象所属的字节码文件对象
toString();返回该对象的字符串表现形式,默认的值为:getClass().getName()+"@"+Integer.toHexString(hashCode()),但通常情况下,都会覆写toString方法,定义特有的实现内容,同equals(Object obj)方法
包与包之间的类进行访问,被访问的包中的类必须是public的,被访问的包中的类的方法也必须是public的
在不同包之间,可用protected限制只有其子类可以对某个类的成员进行访问
public protected defaultprivate
不同包中 ok
子类中 ok ok
同一包中 ok ok ok
同一类中 ok ok ok ok
第十二天有两个练习视频 ... ...