Java基础编程--异常处理详细讲解(Exception)

Java中供了一种识别和响应错误情况的一致性机制——异常处理机制,有效地异常处理能够使程序具有更强的健壮性、易于调试。本篇博客将详细介绍Java中的异常处理(Exception)。


目录:

☍ 异常概述与异常体系结构

☍ 常见异常

☍ 异常处理机制

☍ 异常处理机制一:try-catch-finally

☍ 异常处理机制二:throws抛出异常

☍ 手动抛出异常

☍ 用户自定义异常类

☍ 总结


在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为存在很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等。这时就需要借助Java异常处理机制来解决这部分问题,合理的使用异常处理机制可以降低bug的产生,提高程序的健壮性。

☍ 异常概述与异常体系结构

▴ 异常概述

☃ 异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)

☃ Java程序在执行过程中所发生的异常事件可分为两类:

Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:栈溢出错误:StackOverflowError和堆溢出错误:OOM(OutOfMemoryError)。一般不编写针对性的代码进行异常处理,修改导致错误出现的代码即可。

public class ExceptionTest {
   
	public static void main(String[] args) {
   
		//栈(statck)溢出异常: java.lang.StackOverflowError	
		//main(args);
		
		//堆(heap)溢出异常:java.lang.OutOfMemoryError
		//Integer[] arr = new Integer[1020*1024*1024];
	}
}

Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:

✔ 空指针访问

✔ 试图读取不存在的文件

✔ 网络连接中断

✔ 数组下标越界

☃ 对于这些错误,一般有两种 解决方法:一是遇到错误就终止程序的运行(默认)。另一种方法是由程序员在编写程序时,就考虑到错误的
检测、错误消息的提示,以及错误的处理(主要解决异常的方法)。

☃ 捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生,如数组越界。

☃ 按异捕获的时间可分为:编译时异常运行时异常

异常处理机制

▴ Exception异常分类:编译时异常&运行时异常

编译时异常

☃ 是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。编译器要求Java程序必须捕获或声明所有的编译时异常。

☃ 在Java中, Exception类中除了RuntimeException类及其子类外都是编译时异常,对应上图中受检异常。编译时异常的特点是Java编译器会对其进行检查,如果存在异常情况就必须对异常进行处理,否则程序无法通过编译,如读取空文件的异常。

☃ 对于这类异常,如果程序不处理,可能会带来意想不到的结果。

☃ 处理编译时期的异常有两种方式,具体如下:

(1)使用try…catch语句对异常进行捕获处理。

(2)使用throws关键字声明抛出异常,等待调用者对其处理,如果调用者不处理继续抛出异常。

运行时异常

☃ 是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。

☃ 运行时异常的特点是Java编译器不会对其进行检查,也就是说,当程序中出现这类异常时,即使没有使用try…catch语句捕获或使用throws关键字声明抛出,程序也能编译通过(运行时可能会报错),如数组角标越界异常。

☃ 对于这类异常,可以视情况选择处理(不确定逻辑是否正确)或者不处理(确定逻辑正确时),因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。


☍ 常见异常

▴ 常见运行时异常:java.lang.RuntimeException及其子类

空指针异常NullPointerException
public void NullPointerExceptionDemo() {
   
	Object obj = null;
	System.out.println(obj.toString());
}


数组角标越界异常:ArrayIndexOutOfBoundsException
public void ArrayIndexOutOfBoundException1() {
   
	int[] arr = new int[3];
	System.out.println(arr[5]);
}
public void ArrayIndexOutOfBoundException2() {
   
   	String string = "abcd";
    System.out.println(string.toCharArray()[5]);
}


字符串角标越界异常:StringIndexOutOfBoundsException
public void StringIndexOutOfBoundExceptionDemo() {
   
	String str = "abcd";
	System.out.println(str.charAt(5));
}


类型转换异常:java.lang.ClassCastException
public void ClassCastExceptionDemo() {
   
	class Dog{
   	
	}
	class Cat{
   	
	}
    //Dog dog = new Cat();  编译不通过,语法错误
	Object obj = new Dog();
	Cat cat = (Cat)obj;
}


数字格式异常:java.lang.NumberFormatException
public void NumberFormatExceptionDemo(){
   
	String str = "abc";
	//Integer number = new Integer(str);
	int num = Integer.parseInt
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值