java异常处理
捕获和抛出异常
异常处理的五大关键字:try,catch,finally,throw,throws
1.捕获异常
用法:
try{可能会出现异常的代码
} catch(Exception e)//catch后面跟想要捕获的异常类型
{异常的处理逻辑}
idea快捷键:ctrl+alt+t
eclipse快捷键alt+shift+z
代码示例:
public class Test1 {
public static void main(String[] args) {
int a=1;
int b=0;
try {
//快捷键ctrl+ait+t选择try
System.out.println(a/b);
} catch (ArithmeticException e) {
System.out.println("算术异常");;
} finally {
System.out.println("无论程序是否捕获到异常都会被执行");
}
}
}
输出:
算术异常
无论程序是否捕获到异常都会被执行
2.抛出异常
通过throws关键字声明抛出这个异常,交给方法的调用者去处理,在这里main方法的调用者是JVM,即交给JVM去处理。
throw与throws
throws: 跟在方法声明后面,后面跟的是异常类名
throw: 用在方法体内,后面跟的是异常类对象名
throws: throws表示有出现异常的可能性,并不一定出现这些异常
throw: throw则是抛出了异常,执行throw一定出现了某种异常
throws: 表示抛出异常,由该方法的调用者来处理
throw: 表示抛出异常,由该方法体内的语句来处理
throws:后面可以跟多个异常。用逗号(,)隔开
throw:只能抛出一个异常对象名
代码示例:
public class Demo02 {
//throws后面可以跟多个异常。用逗号(,)隔开
public static void main(String[] args) throws Exception {
Demo02 d=new Demo02();
d.division(5.0,0.0);
}
public void division(double x,double y) throws ArithmeticException{//throws后面跟异常类
double num=x/y;
if (y==0) {
throw new ArithmeticException("算术异常");//后面跟异常对象名
} else {
System.out.println(num);
}
}
}
输出:
Exception in thread "main" java.lang.ArithmeticException: 算术异常
at com.exception.Demo02.division(Demo02.java:11)
at com.exception.Demo02.main(Demo02.java:6)
可以看到当if成立时,会抛出异常,也就是throw才会执行。而当没异常的时候则不会执行!
3.两种处理方式的区别
- 抛出异常:如果程序出现了异常,没有办法将具体的异常打印出来,不做任何处理;程序中断。
- 捕获异常:如果程序出现了异常,就能够详细的打印是什么原因导致了异常并且能够做出相应的处理,能够显示详细的日志,程序不中断。
4.自定义异常
在java中除了,java中给我们定义的异常之外,我们还可以自定义异常。
如何自定义异常:
在进行程序开发的过程中,自定义异常遵循以下四个步骤:
1.首先创建自定义异常类,语法格式:自定义异常类名 extends Exception。
2.在方法中通过关键字throw抛出异常对象。
3.若是在当前抛出异常的方法中处理异常,可以用try-catch语句捕获并处理;若不是,在方法的声明处通过关键字throws指明要抛出给方法调用的异常。
4.在出现异常方法的调用中捕获并理异常。
eg:定义一个大于10就会从抛出的异常
//自定义异常类
public class CustomizeException extends Exception{
private int a;
public CustomizeException(int a) {
this.a = a;
}
//toString:异常的打印信息
@Override
public String toString() {
return "CustomizeException{"+a+'}';
}
}
然后书写一个测试类,里面放可能会存在异常的方法
package com.exception;
public class TestCustomizeException {
//定义一个可能会存在异常的方法
static void test(int a) throws CustomizeException {
System.out.println("传递的参数为"+a);
if (a>10){
throw new CustomizeException(a);
}
System.out.println("ok");
}
public static void main(String[] args) {
try {
test(11);
} catch (CustomizeException e) {
System.out.println("CustomizeException=>"+e);;
}
}
}
输出:
传递的参数为11
CustomizeException=>CustomizeException{11}
这就是自定义异常
自定义异常在实际应用中的经验总结
- 在处理运行时异常的时候,采用逻辑去合理规避同同时辅助try-catch处理
- 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
- 对于不确定的代码,也可以加上try-catch处理潜在的异常
- 尽量去处理异常,而不是只调用PrintStackTrace()去打印输出
- 具体如何处理异常,要根据不同的业务需求和异常类型去决定
- 尽量添加finally语句块去释放占用的资源
本文来自博客园,作者:星余明,转载请注明原文链接:https://www.cnblogs.com/lingstar/p/16482435.html