异常(exception)
异常(exception)
- 异常指程序在运行过程中出现不起而至的状况(网络连接失败)(文件找不到)(非法参数)。
常见的异常类型:
- 检查性异常:用户错误或问题引起的异常。例如打开一个不存在的文件 ,异常就产生了
- 运行时异常:在编译时被忽略的问题产生的异常
- 错误:错误不是异常,而是脱离程序控制的问题。错误在代码中常被忽略。
java中异常当作对象来处理,并定义一个基类java.lang.Fhrowable作为所有异常的超类
java的异常体系结构
最大的异常类为Throwable,后面一层层为子类。
Error又java虚拟机生成抛出,大多数错误与代码编写者所执行的操作无关
java虚拟机运行错误,当jvm不再有执行操作所需的内存资源时,将出现OutOfMemoryError.这些异常发生时jvm一般会选择终止。
Exception分支中有一个重要的子类RuntimeException(运行时异常)
- ArrayIndexOutofBoundsException(数组下标越界)
- NullPointerException (空指针异常)
- ArithmeticException (算数异常)
- MissingResourceException (丢失资源)
- ClassNotFoundException (找不到异常)
Error和Exception的区别:
Error通常是灾难性的错误,是程序无法控制和处理的,当出现这些异常时,java虚拟机一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序应可能的去处理这些异常
异常的处理机制
-
抛出异常
-
捕获异常
-
**常用关键字 **
- try catch finally throw throws
语法:
try{
//监控区域,运行代码
}catch(运行后捕获异常的类型 变量){ //变量用来存放抓到的异常
//捕获到异常时执行
}
finally{
//处理善后工作,一般用于关闭需要关闭的地方,一定后执行的部分
}
finally{}可以省略,catch(){}必须写
catch(){}可以写多个,类似if else,层层递进
注:当写多个catch时,上面的只能比下面的作用域更小,从小到大。
在IDEA中,选中相应的代码,Ctrl+Alt+D可以选中相应的作用域包裹它。
假设一个方法里无法处理一个异常,那么可以主动抛出这个异常,这样做的好处时,抛出异常后不会影响程序的继续执行。
在程序中主动抛出使用throw抛出
在方法上抛出使用throws
在方法里面:
if(b==0)
throw new ArithmeticExcetion();
在方法上:
public void test(int a,int b) throws ArithmeticException{
a=a/b;
}
package tip;
public class Demo02 {
public static void main(String[] args) {
try {
new Demo02().test(1,0);
} catch (ArithmeticException e) {
e.printStackTrace();
}
try {
new Demo02().test02(1,0);
}catch (ArithmeticException e){
e.printStackTrace();
}
}
public void test(int a,int b){
if (b==0){
throw new ArithmeticException();
}
}
public void test02(int a,int b) throws ArithmeticException{
}
}
自定义异常
- 使用java内置的异常类可以描述变成中出现的绝大多数异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可
- 创建自定义的类
- 在方法里通过throw关键字抛出异常
- 如果在当前抛出的方法里处理异常,可以使用try-catch语句捕获并处理;否则在方法里的声明处通过throws关键字指明要抛出给方法调用者的异常,继续下一步操作。
- 在出现异常的方法的调用者中捕获并处理异常
eg:
package tip;
public class MyException extends Exception {//继承Exception
private int detail;
//传递值大于10就会错误
MyException(int a){ //构造器
this.detail=a;
}
@Override
public String toString() { //输出信息
return "您输入的值过大,应为"+this.detail+"-"+(this.detail-10)+"以下";
}
}
调用类:
package tip;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
int a;
Scanner scanner=new Scanner(System.in);
System.out.println("输入传入的数");
a=scanner.nextInt();
new Application().test01(a);//调用方法
}
public void test01(int a){
try{
if (a>10)//数字大于10抛出
throw new MyException(a);//使用throw抛出
System.out.println("ok");//抛出异常时不执行
}catch (MyException e)
{
System.out.println("MyException:"+e);
}
}
}
朋友和酒,少年和诗,路和远方。