Java的异常

发布时间:2024年01月24日

Error表示严重的错误,程序对此一般无能为力,例如:
? ? ? ? OutOfMemoryError:内存耗尽
????????NoClassDefFoundError:无法加载某个Class
????????StackOverflowError:虚拟机栈溢出


Exception则是运行时的错误,它可以被捕获并处理。某些异常是应用程序逻辑处理的部
分,应该捕获并处理。例如:
????????NumberFormatException:数值类型的格式错误
????????FileNotFoundException:未找到文件
????????SocketException:读取网络失败
还有一些异常是程序逻辑编写不对造成的,应该修复程序本身。例如:
????????NullPointerException:对某个nul1的对象调用方法或字段
????????IndexOutOfBoundsException:数组索引越界


Exception又分为两大类:
????????RuntimeException以及它的子类;
????????非RuntimeException(包括IOException、Ref1 ectiveOperationException等等)
Java规定:
????????必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception.
????????不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。

?捕获异常
捕获异常使用try..catch语句,把可能发生异常的代码放到try{.·}中,然后使用catch捕获对应的Exception及其子类:

如果我们不捕获会出现编译失败的问题

在方法定义的时候,使用throws Xxx表示该方法可能抛出的异常类型。调用方在调用的时候,
必须强制捕获这些异常,否则编译器会报错。在toGBK()方法中,因为调用了String·getBytes(stnr
ing)方法,就必须捕获UnsupportedEncodingException。我们也可以不捕获它,而是在方法定义处
用throws表示toGBK()方法可能会抛出UnsupportedEncodingException,就可以让toGBK()方法
通过编译器检查:
可见,只要是方法声明的Checked Exception,不在调用层捕获,也必须在更高的调用层捕获。
所有未捕获的异常,最终也必须在mai()方法中捕获,不会出现漏写try的情况。这是由编译器
保证的。
main()方法也是最后捕获Exception的机会。
如果是测试代码,上面的写法就略显麻烦。如果不想写任何ty代码,可以直接把main()方
法定义为throwsException

因为man()方法声明了可能抛出Exception,也就声明了可能抛出所有的Exception,因此
在内部就无需捕获了。代价就是一旦发生异常,程序会立刻退出。
特殊情况:在toGBK()内部“消化”异常

所有异常都可以调用printStackTrace()方法打印异常栈,这是一个简单有用的快速打印异常
的方法。

package com.xn.Tue;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Tue11 {
	public static void main(String[] args) {
		//try:包围可能产生异常的代码块
		//    如果产生异常,系统会根据异常产生的原因,创建一个异常对象
		//catch:捕获异常,处理异常

		try(Scanner in=new Scanner(System.in)){
			//获取输入是,可能产生InputMismatchException
			//输入非法的内容:a
			//JVM创建一个InputMismatchException类型的异常对象,并抛出
			//程序会从try块退出

			int n1=in.nextInt();
			int n2=in.nextInt();
			
			//计算除法时,可能产生ArithmeticException
			System.out.printf("%d÷%d=%d",n1,n2,n1/n2);	
		}catch (NullPointerException in) {
			System.out.println("空指针");
		}catch(InputMismatchException in) {
			System.out.println("输入错误");
		}
	}
}
package com.xn.wen;
import static java.lang.Math.*;
//静态导入后,调用Math类中的静态方法诗,无需通过类名调用
public class Wen01 {
	public static void main(String[] args) {
		abs(E);
		try {
			//发生异常:JVM创建异常对象,并抛出
			String str=String.format("%(%d)", 11,2*12);
			System.out.println(str);
			
			int[] ns1= {};
			ns1[1]=1;
			
			int[] ns2=null;
			ns2[1]=1;
			
			String s="2s";
			int n=Integer.parseInt(s);
			System.out.println(n*10);
		}catch(ArrayIndexOutOfBoundsException ex){
			System.out.println("数组越界");
		}catch(NullPointerException ex){
			System.out.println("空指针");
		}catch(NumberFormatException ex){
			System.out.println("数字格式化错误");
		}catch(Exception ex){
			System.out.println("异常了");
		}
	}
}


小结
Java使用异常来表示错误,并通过try.catch捕获异常;
Java的异常是class,并且从Throwab1e继承;
Error是无需捕获的严重错误,
Exception是应该捕获的可处理的错误;
RuntimeException无需强制捕获,非RuntimeException
(Checked Exception)需强制捕获,或者用throws声明;
不推荐捕获了异常但不进行任何处理。
?

文章来源:https://blog.csdn.net/m0_74002833/article/details/135830022
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。