Java学习之谈谈异常处理

本文深入探讨Java异常处理机制,包括编译时异常、运行期异常及错误的区别,讲解如何使用try、catch、finally等关键字捕获异常,以及如何通过throw、throws抛出异常。并列举常见异常类型,如空指针异常、类型强制转换异常等。
前言
何为异常?
举个例子:如我们的程序需要对数据库做一个插入的操作,但是可以会因为各种原因而导致发生了错误,这些错误中包含我们能预见的错误,同时也包含了我们不能预见的错误,而为了解决这些在运行中可能出现的错误,每个编程语言都有其对错误的处理。
而Java中专门引入了异常(Exception:翻译过来为例外),异常机制可以及时有效的帮助开发者处理程序中运行的错误。
Java异常种类可分为:
  •   编译时异常:Java.lang.Exception
  •   运行期异常:Java.lang.RuntimeException
  •   错误:Java.lang.Error
所有异常对象的根基类是Throwable,也就是说Java中所有的Exception和Error都是Throwable类的子孙类,而Throwable直接继承Object类。

编译时异常:

从程序语法角度讲是必须进行处理的异常,Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。如下例代码:
上面代码在进行一个读取文件的操作,如果不捕获异常,程序将不能通过编译。

运行期异常:

程序中可以捕获,也可以不捕获,这样的异常一般是由程序逻辑错误引起的,需要修改程序来避免,如数组越界、空指针异常等。该类异常的特点是编译器不会去检查它,也就是说即使你在代码里面没有去捕获该类异常,也将编译通过。
该段代码编译期间并不需要显示的去捕获任何异常,但是在程序运行期间,当代码执行到if(i == 0)时将产生空指针异常。

错误:

是程序无法处理的错误,一般很少会发生,通常与代码无关,而是和Java虚拟机有关,一旦发生了即表示程序发生了比较严重问题。比较典型的Error就是OutOfMemoryError,表示JVM 内存溢出了。
异常处理机制
在 Java 应用程序中,Java异常处理通过5个关键字try、catch、throw、throws、finally进行管理,异常处理机制分为:
  • 捕获异常
  • 抛出异常
捕获异常:使用try、catch、finally关键字来捕获异常,使程序发生异常时不中断,从而能够继续往下执行。通过上面的代码做一下改进,如:
 

1  public static void main(String[] args) {  2       Integer i = null;   
3         try{    
4          if(i == 0){          
5                 System.out.println(0);          
6                  }  
7       }catch(RuntimeException e){     
8          System.out.println("发生异常");   
9         }  
10     System.out.println(1); 
11 }

运行上面代码执行到if(i == 0)时将产生空指针异常,这时程序将跳到catch代码中执行,会先打印发生异常,由于发生异常的代码我们使用try进行捕获了,再执行完catch代码块后程序将继续往下执行打印1。
通常,我们在日常编程中进行异常捕获时应该根据程序的需要来决定是否增加finally块,在Java程序中如果增加了finally代码块时无论是否发生异常,finally代码块都将执行。如进行一个IO操作时,无论程序是否发生异常都需要关闭流,这时就应该关闭流的操作放入finally中,如:
通俗一点讲就是catch代码块不一定执行,但是finally块一定会执行。PS:在catch块中可以调用printStackTrace方法打印出堆栈的异常信息,但是这种方式只建议在开发环境下进行。
抛出异常:任何Java方法中的代码都可以使用throw、throws抛出异常, 抛出异常表示自己并不处理异常,  而是把可能出现的异常抛给调用者去处理。
throws用在方法定于上,一旦方法使用了throws抛出某个异常时,那么调用者必须处理这个异常,如果调用者也不想处理这个异常,那么也必须往上将异常抛出,最终将有JVM来处理该异常,强烈建议不要交给JVM去处理:
这段代码在test方法中使用throws抛出了FileNotFoundException和IOException两个异常,而在main方法调用test方法时并没有try、catch去捕获这两个异常,也没有使用throws抛出,所以该程序将无法通过编译器编译,正确的做法应该:
当然,更推荐是在main方法中由我们自己来处理,而不是抛给JVM去处理:
除了上面使用throws在方法上抛出异常,有些时候我们需要在方法体里面根据需要抛出某个异常时,可以使用throw来操作。
throw用来抛出一个Throwable类型的异常,程序会在throw语句后立即终止,它后面的代码将不会执行,如:
该段代码在进入到if块后将执行throw new RuntimeException,当这段代码执行完后程序将终止,不再往后执行。

常见的异常有:

空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
  数组负下标异常:NegativeArrayException
  数组下标越界异常:ArrayIndexOutOfBoundsException
  文件未找到异常:FileNotFoundException
  字符串转换为数字异常:NumberFormatException
  输入输出异常:IOException
方法未找到异常:NoSuchMethodException

小结:

1、不要将大块的代码放进try中,避免把不会出现异常的代码放到try块里面
2、避免异常的类型全部都写成Exception,应该细化异常类型
3、使用throws抛出异常时尽量自己处理,不要交给JVM来处理
内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值