Java异常总结

一、java异常定义

1.所谓异常就是指程序在运行时出现错误时通知调用者的一种机制。
2.异常举例
除以“0”

system.out.println(10/0);
//执行结果
Exception in thread "main" java.lang.ArithmeticException : / by zero

数组下标越界

int[] arr = {11,2,3};
system.out.println(arr[100]);
//执行结果
Exception in thread "main" java.lang.ArrayIndexoutofBoundsException : 100

访问 null 对象

public class Test {
public int num = 100;
public static void main(string[] args){
Test t = null;
sysout.out.println(t.num);
	}
}
//执行结果
Exception in thread "main" java.lang.nullpointerException

二、异常的基本用法

1.捕获异常
基本语法:

try{
	//又可能出现异常的语句;
}[catch (//异常类型 异常对象) {
}...]
[finally {
//异常出口
}]

说明:

  1. try 代码块中放的是可能出现异常的代码;
  2. catch 代码块中放的是出现异常后的处理行为;
  3. finally 代码块中的代码用于处理善后工作,会在最后执行;
  4. catch finally 都可以根据情况选择加或不加。
    2.代码示例
    ①不处理异常
int[1,2,3];
system.out.println("before");
system.out.println(arr[100]);
system.out.println("after");
//执行结果
Exception in thread "main" java.lang.ArrayIndexoutofBoundsException : 100

一旦出现异常,程序就终止了 .after 没有正确输出。

②使用 try catch 后的程序执行过程

int[1,2,3];
try{
system.out.println("before");
system.out.println(arr[100]);
system.out.println("after");
}catch(ArrayIndexoutofBoundsException e) {
//打印出现异常的调用栈
e.printStackTrace();
}
system.out.println("after try catch");
//执行结果
before 
java.lang.ArrayIndexoutofBoundsException : 100
	at demo02.Test.main(Test.java: 10)
after try catch

一旦 try 中出现异常,那么 try 代码块中的程序就不会继续执行,而是交给 catch 中的代码块来执行 .catch 执行完毕会继续往下执行。

三、异常处理流程

  1. 程序先执行 try 中的代码;
  2. 如果 try 中的代码程序异常,就会结束 try 中的代码,看和 catch 中的异常是否匹配;
  3. 若匹配就执行 catch 中的代码;
  4. 若不匹配,就会将异常向上传递到上层调用者;
  5. 无论执行 3或者4 ,finally 中的代码都会在该方法结束之前执行;
  6. 若上层调用者也没有处理的了异常,就继续向上传递;
  7. 一直到 main 方法也没有合适的代码处理异常,就会交给 JVM 来进行处理,此时程序就会异常终止。

四、Java异常体系

Java内置异常类之间的继承关系:
在这里插入图片描述
说明:

  1. Java语言规范将派生与 Error 类或 RuntimeException 类的所有异常称为非受查异常,所有的其他异常称为受查异常
  2. 如果一段代码可能抛出 受查异常,那么必须进行显式处理。
    例:
public static void main(string[] args){
	system.out.println(readFile());
	}
	public static String readFile(){
	//尝试打开文件,并读其中一行
	File file = new file ("d : /test.txt");
	//使用文件对象构造 Scanner 对象
	Scanner sc = new Scanner (file);
	return sc.nextLine();
	}
	//编译出错
	Error: (13,22) java : 未报告的异常错误 java.io.FileNotFoundException; 必须对其进行捕获或声明以便抛出。

显式处理方法:
①使用 try catch

public static void main(string[] args){
	system.out.println(readFile());
	}
	public static String readFile(){
		File file = new file ("d : /test.txt");
		Scanner sc = null;
	try{
		sc = new Scanner(file);
	}catch(FileNotFoundException e){
		e.printStackTrace();
	}
		return sc.nextLine();
	}

②在方法上加上异常说明,相当于将处理动作交给上级调用者

public static void main(string[] args){
try{
	system.out.println(readFile());
	}catch(FileNotFoundException e){
		e.printStackTrace();
		}
	}
	public static String readFile(){
		File file = new file ("d : /test.txt");
		Scanner sc = new Scanner (file);
		return sc.nextLine();
	}

扩展

  1. Java中还存在自定义异常,自定义异常通常会继承自 Exception 或者 RuntimeException;

  2. 继承自Exception的异常默认是受查异常

  3. 继承自RuntimeException的异常默认是非受查异常

    以上为我对Java异常的一些浅显的总结。仅供大家参考,有错误请及时联系更改。欢迎大家提出建议。
    才学疏浅,总结的不是很全面,还望见谅。
    
其他还有很多异常,我就不一一列举了,我要说明的是,一个合格的程序员,需要对程序中常见的问题有相当的了解和相应的解决办法,否则仅仅停留在写程序而不会改程序的话,会极大影响到自己的开发的。关于异常的全部说明,在api里都可以查阅。 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityException 文件已结束异常:EOFException 文件未找到异常:FileNotFoundException 字符串转换为数字异常:NumberFormatException 操作数据库异常:SQLException 输入输出异常:IOException 方法未找到异常:NoSuchMethodException java.lang.AbstractMethodError 抽象方法错误。当应用试图调用抽象方法时抛出。 java.lang.AssertionError 断言错。用来指示一个断言失败的情况。 java.lang.ClassCircularityError 类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常java.lang.ClassFormatError 类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。 java.lang.Error 错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。 java.lang.ExceptionInInitializerError 初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。 java.lang.IllegalAccessError 违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常java.lang.IncompatibleClassChangeError 不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。 java.lang.InstantiationError 实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常. java.lang.InternalError 内部错误。用于指示Java虚拟机发生了内部错误。 java.lang.LinkageError 链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。 java.lang.NoClassDefFoundError 未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。 java.lang.NoSuchFieldError 域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。 java.lang.NoSuchMethodError 方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。 java.lang.OutOfMemoryError 内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。 java.lang.StackOverflowError 堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。 java.lang.ThreadDeath 线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。 java.lang.UnknownError 未知错误。用于指示Java虚拟机发生了未知严重错误的情况。 java.lang.UnsatisfiedLinkError 未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。 java.lang.UnsupportedClassVersionError 不支持的类版本错误。当Java虚拟机试图从读取某个类文件,但是发现该文件的主、次版本号不被当前Java
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值