Java异常
在编译Java源文件的时候,每次或多或少都会出现各种各样的异常,如:NullPointerException(空指针异常),ArrayIndexOutOfBoundsException(数组角标越界异常),等等一些。出现这些情况的时候往往无法正常编译,有时编译通过但在运行的过程中却发生错误,程序便会终止运行。这便是异常。
异常和错误:
- 异常:程序在运行期间发生了异常,通常可以有针对性的处理方式的。
- 错误:程序在运行期间发生了错误,通常不会有针对性的处理方式。错误的的发生往往都是系统级别的问题,都是 jvm所在系统发生的并反馈给jvm的。无法针对处理,只能修正代码。
异常体系:
声明异常:
当方法内不能自己解决该异常时便需要将异常声明
捕获异常:
便是解决异常,使用try-catch
异常出现的案例:
public class Main {
public static void main(String[] args) {
int[] a=new int[10];
int index=10;
show(a,index); //如果出现异常,程序便会终止
System.out.println("over");
System.out.println(10/0); //如果执行到这里会报算数运算异常,没捕获该异常,由jvm直接抛出
}
public static void show(int[] a,int index){
try{ //尝试运行
System.out.println(a[index]);
//如果出现角标越界就捕获该异常
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(a[0]);
}
}
}
什么时候捕获?
如果函数内部能够解决这个问题则捕获
什么时候声明?
函数内部解决不了,就要向调用者提示且声明
如果抛出的异常一直被声明直到JVM都没人解决,那么直接报错
运行时异常可不可以被捕获或声明?
可以,但是没必要,看具体需求
在捕获异常时,没有必要将大段的代码放入try语句中,只需要将可能出现问题的代码放入即可,否则会导致一些和异常不相关的代码被跳过
在继承中,异常是什么样的特点?
1.如果父类函数没有声明异常(编译时)
则子类重写的函数也不可以声明异常(编译时)
2.如果父类函数声明异常
则子类重写的函数可以声明父类异常的子类或子集
自定义异常:
package p4.异常;
public class Main2 {
public static void main(String[] args) {
try{
sleep(900);
}catch(TimeBigerExcetion e){
System.out.println("问题处理了!");
}
System.out.println("over");
}
//时间大于100或小于0则出现异常
public static void sleep(int time) throws TimeBigerExcetion {
if(time<0){//时间过小
throw new TimeSmallerException("时间小于0,不能睡!");
}
if(time>100){//时间过大,创建异常对象
throw new TimeBigerExcetion("时间太长了,死了!");
}
System.out.println("我睡了"+time+"天");
}
}
class TimeSmallerException extends RuntimeException{ //自定义一个运行时异常
public TimeSmallerException(String s){
super(s);
}
}
class TimeBigerExcetion extends Exception{ //自定义一个编译时异常
public TimeBigerExcetion(String s){
super(s);
}
}