异常处理
在程序的编辑和运行期间,会产生人为疏忽或不可避免的程序异常。因此出现了异常处理机制,将java中的异常来封装到一个类中,当遇到错误时,就会抛出异常。异常处理机制提高了程序的可维护性和可阅读性。
异常处理相当于一个安全护栏,如果马路没有安全护栏,汽车行驶过程中如发生偏离 会直接冲出马路导致更严重的后果。异常处理也是同理,在进行一些程序之外的操作或发生不可控的因素时,能够制止。如果没有进行异常处理,会导致程序直接终止。
异常处理的关键字:try、catch、finally、throw、throws
异常处理大致分为两个环节
-
抛出异常:使用try关键字生成一个代码块,将代码放入代码块中
-
捕获异常:使用catch关键字进行捕获,在catch的括号里输入异常的类型,如果try内的代码出现这个问题,则执行catch代码块中的内容。
package com.exception;
public class Demo01 {
public static void main(String[] args) {
//0不能作为被除数,当a除以b时,会报错。
int a = 1;
int b = 0;
try {//try监控区域
System.out.println(a/b);//被监控的代码
}catch (ArithmeticException e){//捕获异常区域
System.out.println("异常!!");//如果符合这种类型的异常,就输出
}finally{//作为善后区域,无论有没有异常都会执行。
System.out.println("finally");
}
}
}
快捷键 : ctrl + Alt + T 自动打开快捷栏,可以选择if、if()else、for、switch……等,当然也包含try、catch、finally。
在异常中,可以大体分为错误Error 与 异常Exception两种形态,Error是不可预见的,一般是程序内存栈溢出之类不是程序主观原因导致的运行时错误。 Exception则属于人为因素导致的异常,如编辑代码出现的错误导致异常,或用户未规范操作程序等因素。java中所有的异常是被Throwable涵盖的。一些常见的异常如下:
catch可以重复使用多个,但捕获的异常需要按照异常的大小来排列,由小到大。
package com.exception;
public class Demo02 {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
System.out.println(a/b);
} catch (Error e) {
System.out.println("Error");
}catch (Exception e){
System.out.println("Exception ");//该异常为Exception
}catch (Throwable t){
System.out.println("Throwable");
}finally {
}
}
}
抛出异常
抛出异常:将一个异常给到另外一个方法或类里,由另外一个类进行处理。
所以抛出异常之后,需要再获取异常,这就可以在方法中使用throws抛出异常,然后再在其他地方获取异常进行处理。
在判断某个方法可能会产生异常,但不想在方法中处理这个异常,就可以将异常抛出。在该方法之外处理这个异常。
使用throw与throws关键字来在方法中抛出异常
throw和throws的区别:
-
throw是用来制造一个异常的,用在方法体中,可以直接在方法体中获取并处理这个异常。 throws用在方法声明的后面,表示将方法中的异常抛出,这样可以在其他地方处理这个方法中的异常。
-
throw是直接抛出一个异常的实例,无中生有。 throws是声明这个方法可能会出现的异常,以便使用它的调用者知道要捕获这个异常。
-
throws只是代表一种可能性,可能会出现这种异常。 throw是直接制造出这个异常,所以一定会出现这个异常。
所以,通常我们使用的都是throws关键字,而throw一般用在自定义异常中。
throw的使用:
package com.exception;
public class Demo03 {
public static void main(String[] args) {
new Demo03().aa();//使用匿名内部类调用这个类
}
public void aa(){
throw new ArithmeticException();//使用throw关键字抛出一个异常
}
}//运行结果为 ArithmeticExceptio异常
throws的使用
package com.exception;
public class Demo03 {
public static void main(String[] args) {
try {//使用try获取
new Demo03().aa(1,0);//使用匿名内部类调用这个类
} catch (ArithmeticException e) {//使用catch处理这个异常
System.out.println("除数不能为0");
}
}
public void aa(int a,int b)throws ArithmeticException{//使用throws声明这个类可能会出现的异常
System.out.println(a/b);
}
}