java学习日记20230330-异常
异常基本概念
- java语言中,将程序执行中发生的不正常情况称为异常,开发中的语法错误和逻辑错误不是异常;
- 执行中的异常事件可以分为两类
- error(错误),java虚拟机无法解决的严重问题:如jvm系统内部错误,资源耗尽:StackOverflowError【栈溢出】和OOM(out of memory)
- exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针访问,读图读取 不存在的文件,网络连接中断等,分为运行时异常和编译时异常;
- 异常体系图
- java源程序-编译异常——字节码文件-运行异常——在内存中加载运行类
- 异常分为两大类,编译时异常和运行时异常
- 运行时异常,编译器不要求强制处置的异常,一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及其子类都是运行时异常
- 对于允许时异常,可以不做处理,因为这类异常很普遍,若泉处理可能会对程序的可读性和运行效率产生影响
- 编译时异常,时编译器要求必须处置的异常
- 常见运行时异常
- NullPointerException空指针异常
- 当程序试图在需要对象的方法使用null时,抛出该异常
- ClassCastException类型转化异常
- 当试图将对象强制转化为不是实例的子类时,抛出该异常
- ArithmeticException数学运算异常
- 当出现异常的运算条件时,抛出此异常
- ArrayIndexOutOfBoundsException数据下标越界异常
- 用非法索引访问数组时抛出的异常,如果索引为负或大于等于数组大小,则该索引为非法索引
- NumberFormatException数字格式不正确异常
- 当应用程序试图将字符串转化成一种数值类型时,但该字符串不能专为为适当格式,则抛出异常
- NullPointerException空指针异常
- 编译异常:在编译期间,就必须处理的异常,否则代码不能通过编译
- SQLException 操作数据库时,查询表可能发生异常
- IOException操作文件时,发生的异常
- FileNotFoundException 当操作一个不存在的文件时,发生异常
- ClassNotFoundException 加载类,而该类不存在时,异常
- EOFException 操作文件,到文件末尾,发生异常
- IIIegalArgumentException 参数异常
- 异常处理机制
-
- try-catch-finally:当异常发生时,系统将异常封装成Exception对象e,传递给catch,得到异常对象时,自定义处理,不管try代码块是否有异常发生,始终要执行finally,如果没有发生异常,catch代码块不会执行,finally一般时资源释放
- java中提供try和catch块来处理异常,try中包含可能出错的代码,catch块用于try块中发生的异常;
- try{可以的代码,将异常生成对应的异常对象,传递给catch块}catch(异常){对异常的处理};
- 如果异常发生,则异常发生后面的代码不会执行,直接进入catch块
- 如果异常没有发生,则顺序执行try的代码块不会进入到catch
- 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源)则使用finally{}
- 可以有多个catch语句捕获不同的异常,要求父类异常在后,子类异常在前,比如Exception在后,NullPointerException在前
- 可以进行tr-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉,应用场景就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑
-
public class TryCatchDetail01 { public static void main(String[] args) { try { int n1 = 10/1; String str = "123"; int a = Integer.parseInt(str); System.out.println(a); Person person = new Person(); person = null; person.getName(); } catch (ArithmeticException e) { System.out.println(e.getMessage()); } catch (NumberFormatException e) { System.out.println(e.getMessage()); } catch (NullPointerException e) { System.out.println(e.getMessage()); }finally { System.out.println("finally"); } } } class Person{ private String name ="jack"; public String getName() { return name; } }
- 如何没有出现异常,则执行try块中的所有语句,不执行catch块中语句,如果有finally,则最后还需要执行finally语句
- 如果出现异常,则try中异常发生后,剩下的语句不再执行,将执行catch中的语句,如果有finally,最后还需要执行finally语句
- 如果catch中有return,则会内存中隐式生成一个临时变量存储数据,执行完finally后,返回临时变量
- throws:JVM——MAIN方法——其他方法,throws可以将异常范围给上一层级,jvm输出异常信息,终止程序,默认采用throws方法
- 如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示的声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
- 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是他的父类
-
public class Throws01 { public static void main(String[] args) { try { f1(); } catch (FileNotFoundException e) { System.out.println("yichagnle "); } } public static void f1() throws FileNotFoundException,NullPointerException { //编译异常 FileInputStream fis = new FileInputStream("d://aa.txt"); } }
- 对于编译异常,程序中必须处理
- 对于运行时异常,程序如果没有处理,默认就是throws方法
- 子类重写父类时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常类型一致,要么为父类抛出的异常类型的字类型
- 在throw过程中,如果有方法try catch,就相当于处理异常,就可以不必throws
-
public class Throws02 { public static void main(String[] args) { f2(); } public static void f2(){ int n1 = 10; int n2 = 0; double res = n1/n2; } } class Father{ public void method() throws RuntimeException{ } } class Son extends Father{ @Override public void method() throws RuntimeException{ super.method(); } }
- 自定义异常
- 当程序中出现了某些错误,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息
- 定义类:自定义异常类名继承Exception或RuntimeException
- 如果继承Exception,属于编译异常
- 如果继承RuntimeException,属于运行异常
-
public class CustomException01 { public static void main(String[] args) { Person01 person = new Person01(180); try{ if(person.getAge()<18 || person.getAge()>120){ throw new AgeOverLimit("年龄超过限制"); }} catch(Exception e){ System.out.println("yichagnle"); } } } class AgeOverLimit extends RuntimeException{ //一般情况把自定义异常继承运行时异常,可以使用默认处理机制 public AgeOverLimit(String message) { System.out.println(message); } } class Person01{ private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person01(int age) { this.age = age; } }
-
throw和throws的区别
-
throws:异常处理的一种方式,方法声明处,异常类型
-
throw:手动生成异常对象的关键字,方法体中,异常对象
-
- try-catch-finally:当异常发生时,系统将异常封装成Exception对象e,传递给catch,得到异常对象时,自定义处理,不管try代码块是否有异常发生,始终要执行finally,如果没有发生异常,catch代码块不会执行,finally一般时资源释放
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构