常见异常
-
数组角标越界
ArrayIndexOutofBoundsException -
空指针异常
NullPointerException -
栈溢出异常
StackOverFlowError -
堆溢出异常
OutofHeapError -
类型转换异常
ClassCastException -
数学异常
ArithmeticException -
数据转换异常
NUmberFormatException
异常和错误的发生和区别
什么是异常: Java运行时期发生的问题就是异常
异常和错误
- 异常:程序在运行期间发生了异常,通常可以有针对性的处理方式的。
- 错误:程序在运行期间发生了错误,通常不会有针对性的处理方式。错误的的发生往往都是系统级别的问题,都是jvm所在系统发生的并反馈给jvm的。无法针对理,只能修正代码。
我们如果用面向对象的思考方式对待异常
异常应该有哪些内容?名称 位置 原因
异常当成一个类去看待!
错误多不多?各种各样的错误?
该异常类的子类多不多?
所以异常继承体系就出来了!
问 异常体系的最终父类是Object
但是异常体系的体系内最终父类 Throwable
当函数内部出现问题:
-
要么函数内部自己解决
return 正常结果 -
要么函数将问题反馈给调用者
throw 异常对象
抛出异常:JVM抛 throw抛
Throwable
-
Error 严重性错误 JVM直接抛出内存错误
直接改代码吧 -
Exception 一般性错误 JVM可抛 throw抛
可以尝试改正(已经事先有解决方案) -
RuntimeException 运行时异常
其他子类 编译时异常 -
自定义异常 继承Exception即可
对于编译时异常 通常有两种处理方案:
- 捕获 就是自身内部处理掉这个问题
try
{
//需要被检测的语句。
}
catch(异常类变量)//参数。
{
//异常的处理语句。
}
finally
{
//一定会被执行的语句。
}
- 声明 就是告诉调用者该函数可能会出事
throws 异常类
异常在继承或者实现中的使用细节:
● 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者声明越来越精细。
● 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集越来越精细。
当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。
举例:父类存在这种情况,接口也有这种情况,
问题:接口中没有声明异常,而实现的子类覆盖方法时发生了异常,怎么办?
无法进行throws声明,只能catch的捕获。万一问题处理不了呢? catch中继续throw抛出,但是只能将异常转换成RuntimeException子类抛出
code:
class ExceptionDemo02{
public static void main(String[] args){
/*
MyString ms=new MyString();
System.out.println(ms.charAt(10));
*/
try{
sleep(-10);
}catch(TimeCannotNegetiveException e){
System.out.println("下课!");
}
}
public static void sleep(int time) throws TimeCannotNegetiveException {
if(time<0){
throw new TimeCannotNegetiveException("时间不能为负数");
}
if(time>100000){
try{
throw new TimeOverLimitException("睡死了!");
}catch(TimeOverLimitException e){
time=10;
}
}
System.out.println("睡了"+time+"秒");
}
}
//时间不能为负数异常
class TimeCannotNegetiveException extends Exception{
TimeCannotNegetiveException(String reason){
super(reason);
}
}
//时间不能超过时限异常
class TimeOverLimitException extends Exception{
TimeOverLimitException(String reason){
super(reason);
}
}
class MyString{
char[] value=new char[10];
public char charAt(int index){
if(index<0||index>=value.length){
throw new ArrayIndexOutOfBoundsException();
}
return value[index];
}
}