Java异常
什么是异常
- 实际工作中,遇到的情况不可能是非常完美的,比如用户输入不一定符合程序的要求,就是一个异常
- 软件运行过程中,经常遇到一些异常问题,英文名称为Exception
- 分类
- 检查性异常:最具代表性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略
- 运行异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略
- 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,编译时也检查不到的
异常体系结构
-
Java吧异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类
-
Java API中已经定义了许多异常类,这些异常类分为两大类,错误ERROR和异常Exception
Error类异常
- Error类对象由java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关
- java虚拟机运行错误(VirtualMachineError)。当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,java虚拟机一般会选择线程终止
- 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的情况
Exception类异常
- 在Exception类分支中有一个重要的子类RuntimeException(运行时异常),这些异常一般是由程序逻辑错误引起的
- Exception通常是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常
Java异常处理机制
-
异常处理的五个关键字
try、catch、finally、throw、throws
public class Test { public static void main(String[] args) { int a = 1; int b = 0; try{//监控区域 if(b==0){ throw new ArithmeticException();//主动抛出异常 } System.out.println(a/b); }catch(Error e){//(想要捕获的异常类型)捕获异常,可以catch多个类型异常,当需从小到大的去捕获 System.out.println("程序出现异常1:除数不能为0"); }catch(Exception e){ System.out.println("程序出现异常2:除数不能为0"); }catch(Throwable t){ System.out.println("程序出现异常3:除数不能为0"); }finally{//处理一些善后工作,是可选的,如关闭IO流 System.out.println("fianally"); } public void test(int a, int b){ if(b==0){ throw new ArithmeticException();//主动抛出异常,一般用在方法里 } System.out.println(a/b); } /* 使用快捷键:ctrl+alt+T try { System.out.println(a/b); } catch (Exception e) { e.printStackTrace(); } finally { } */ } }
自定义异常
-
使用java内置的异常类可以描述在编程时出现的大部分异常情况,除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可
-
自定义异常类的步骤
-
创建自定义异常类
-
在方法中通过throw关键字抛出异常对象
-
如果当前抛出异常的方法处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过Throws关键在致命抛出给方法调用者的异常,继续下一步操作
-
在出现异常方法的调用者中捕获并处理异常
//自定义异常类 public class MyException extends Exception{ //传递数字,大于10就抛出异常 private int detail; public MyException(int a){ this.detail = a; } //异常的打印信息 @Override public String toString() { return "Mexception{" + "detail=" + detail +"}"; } }
-