Java的异常处理
Java把所有不正常情况分为两种,它们都继承Throwable父类#
--错误:一般之虚拟机相关问题,如系统崩溃,虚拟机错误,动态连接失败等,这类情况不能恢复或不可能被捕获。
--异常:与错误相反,
主要依赖5个关键字:try、catch、finally、throw、throws’
1. 抛出Checked异常和Runtime异常的区别#
- 不是RuntimeException类及其子类的实例被称为Checked异常
- Checked异常:要么使用throws显示的抛出,要么用try..catch显示的捕获它,并处理.
- Runtime异常: 无需显示的抛出,如果需要可以使用try..catch显示的捕获它
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public class ExceptionDemo { public static void main(String[] args) { try { //调用Checked异常方法,要么在main方法中再次抛出,要么显示的处理它 throwChecked( 4 ); } catch (Exception e) { System.out.println(e.getMessage()); } //调用抛出Runtime异常的方法,既可以显示的捕获它,也可以不理会该异常 throwRunTime( 4 ); } /* * 自行抛出Exception异常 * 该代码必须在try块中,或者在带有throws声明的方法中 */ public static void throwChecked( int a ) throws Exception{ if (a> 0 ){ throw new Exception( "a的值大于0" ); } } /* * 自行抛出Runtime异常 * 可以完全不理会该异常,也可以交给该方法的调用者处理 */ public static void throwRunTime( int a){ if (a> 0 ) { throw new RuntimeException( "a的值大于0" ); } } } |
运行的结果:
2. 自定义异常类#
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * 自定义异常类,提供两个构造器 * 如果希望是Runtime异常,则继承RuntimeException基类 */ class AuctionException extends Exception { public AuctionException() { } public AuctionException(String message) { super (message); } } |
3. catch和throw同时使用#
企业级应用中通常对异常处理通常分为两个部分,一个是后台通过日志记录异常发生的详细情况,
另一个是根据异常向使用者(非开发者)传达某种提示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class ExceptionDemo2 { private static double initPrice = 30.0 ; public static void bid(String bidPrice) { double d = 0.0 ; try { d = Double.parseDouble(bidPrice); } catch (Exception e) { //此处仅仅在控制台打印出异常 e.printStackTrace(); //再次抛出自定义异常 throw new RuntimeException( "竞拍的价格必须是数值" ); } if (initPrice > d){ throw new RuntimeException( "竞拍价不许比起拍价低" ); } } public static void main(String[] args) { try { bid( "abc" ); } catch (Exception e) { //再次捕获异常,并处理 System.err.print(e.getMessage()); } } } |
结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了