注意:
* 1.当程序可能出现多种异常,而且又要为这些异常一一处理时,后面依次列写catch语句块
* 2.但所列写的catch应该满足从子类到父类的异常处理,如上面,第一和二两个异常都是Exception的子类
* 3.finally语句跟在catch语句后面,用来实行一些出现异常后要进行的处理
* 4.处理运行时异常时,采用逻辑去合理规避,同时辅助try_catch处理
* 5.在多重catch后面,可以加上一个catch(Exception e)癞处理可能被遗漏的异常
* 6.对于不确定的代码,可以加上try_catch,处理潜在的异常
* 7.尽量去处理异常,切忌只是简单的调用printStackTrace()去打印输出
* 8.尽量添加finally语句块去释放占用的资源
代码实例:
public class Try_catch {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
try{
System.out.println("请输入第一个数:");
int one=input.nextInt();
System.out.println("请输入第二个数:");
int two=input.nextInt();
System.out.println("两数相除得:"+one/two);
}catch(InputMismatchException e){
e.printStackTrace();
System.out.println("请输入数字!!!");
}catch(ArithmeticException e){
System.out.println("除数不能为零!!!");
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
System.out.println("未知的异常!!!");
}finally{
System.out.println("finally语句块用来善后,比如出现异常后关闭一些文件等");
}
System.out.println("程序结束!");
}
}
自定义异常:
注意:自定义异常类必须继承于与之相近的异常类或是Exception
【由于有了含参的构造器,编译器便不会再给分匹配无参构造器,而有时候需要使用,所以可以再添加一个无参的构造器】
public class Custom_Exception extends Exception{
public Custom_Exception(){
}
public Custom_Exception(String message){//含参的构造器
super(message);
}
}
异常链:
initCause()方法对异常进行包装的,目的为了出了问题的时候能够追根究底。因为一个项目,越往底层,可能抛出的异常类型会用很多,如果你在上层想要处理这些异常,你就需要挨个的写很多catch语句块来捕捉异常,这样是很麻烦的。如果我们对底层抛出的异常捕获后,抛出一个新的统一的异常,会避免这个问题。
public class Exception_link {
public static void main(String[] args) {
Exception_link cs=new Exception_link();
try{
cs.test2();
}catch(Exception e){
e.printStackTrace();
}
}
public void test1() throws Custom_Exception{
//调用自定义的异常类
throw new Custom_Exception("喝酒别开车!");
}
public void test2(){
try{
test1();
}catch(Custom_Exception e){
//构造RuntimeException
RuntimeException newExc=new RuntimeException("司机一滴酒,亲人两行泪");
newExc.initCause(e);
//将原异常包装,抛出运行时异常
throw newExc;
}
}
}