###学习心得###
今天学习的是异常处理,明白了什么是抛出异常,原来异常还可以自己定义,异常情况有两种,编译期异常 运行期异常
###心情###
感觉听明白了,但是有的时候要想好久异常该怎么改,怎么调用,怎么声明异常
--------------------------------------------------------------------------------------------------------------------------------------------------------------
* 异常处理
* 1.下标越界
* 2.空指针
* 3.类型转换异常
* 4.数字格式化
* 5.算术异常(数学异常)
*
* 编程界:
* 1.除数为零
* 2.IO流,没有关闭
* 3.停电
*
* 当一个程序抛出异常时,抛出异常的语句后面的语句不再执行,类似于return的功能
* 终止方法的执行
* 异常的继承体系结构
* 最顶级的Throwable:错误异常
* Error:正常情况下,一般不会出现,绝大多数情况下都会导致程序处于非正常状态下,很难恢复。外力的作用下,不考虑。
* Error是Thorwable的子类,它是在Java程序处理范围之外的。
* Exception:Java语言中,将程序执行中发生的不正常的情况称之为异常。
* 编译期异常:写代码时候抛出异常,如果编译期没解决,会一直不通过,一直报红
* 运行期异常:RuntimeExpection,运行时抛出异常,平时没事
* 自定义异常:
* Java中异常机制,但是结合实际业务
* 怎么自己定义异常?
* 1.所有异常必须是throwable的的子类,(大材小用没必要)
* 2.如果要定义一个编译期异常,需要继承Expection类
* 3.如果定义一个运行期异常,需要继承RuntimeExpection类
public class Ch02 { public static void main(String[] args) { int num1 = 10; int num2 = 0; try {//把有可能出异常的代码放到try语句块里 System.out.println(num1 / num2); }catch (Exception e) { System.out.println("除数不能为零"); e.printStackTrace(); } System.out.println("我很重要..."); } }
* 在一个语句块中如果使用throw抛出编译期异常必须在方法的声明的后面加上throws关键字来标识
* 或者直接 try catch
* 为什么要手动抛出异常?
public class Ch03 { public static void fun(int i,int j) throws MyException { if (j==0){ throw new MyException("除数不能为零"); } System.out.println(i/j); } public static void main(String[] args) { try{ fun(1,0); }catch (MyException e){ e.printStackTrace(); } System.out.println("异常"); } }
* throw语句是可以当作方法的返回值的
* 在一个有返回值的方法中如果有分支,一定保证每种条件都有返回值
import java.util.Objects; public class Ch04 { public static String show(String str){ if (Objects.isNull(str)){ return str.concat("hello"); } throw new RuntimeException("参数不能是空"); } public static void main(String[] args) { show("null"); } }
* 如果一个方法没有捕获一个编译期异常,该方法必须使用throws来声明。
* throws并不是真正的解决了异常,只是把异常抛给了下一级调用者。
* 面试题:
* throws和throw区别!!!
* throws出现在什么地方?
* 方法的声明处,抛出多个异常,用逗号隔开。
public class Ch06 { public void show() throws MyException,RuntimeException,NullPointerException,IndexOutOfBoundsException { } public void info() throws MyException { show(); } // JVM public static void main(String[] args) { try { new Ch06().info(); } catch (MyException e) { throw new RuntimeException(e); } } }
* finally关键字
* finally用来创建在try代码块后面执行的代码块
* 无论是否发生异常,finally代码块中的代码一定会执行。一般finally中的代码都是用来释放资源。
* try...catch...finally:
public class Ch07 { public static void main(String[] args) { int num1 = 10; int num2 = 2; String str = null; try { System.out.println(num1 / num2); System.out.println(str.length()); // main(args); }finally{ System.out.println("finally..."); } } }
* catch可以写多个,有顺序问题。
* 先写小的,再写大的
public class Ch08 { public static void main(String[] args) { int num1 = 10; int num2 = 0; try { System.out.println(num1 / num2); // 开发角度来说,应该写指定的。 } catch (ArithmeticException e) { // e.printStackTrace(); System.out.println("除数不能为0"); } catch (Exception e){ System.out.println("未知错误"); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构