Java的异常 Exception

发布时间:2024年01月23日

从继承关系可知:Throwable 是异常体系的根,它继承自Object 。Throwable 有两个体系:?Error 和Exception.

Error表示严重的错误,程序对此一般无能为力,例如:

  • OutOfMemoryError :内存耗尽
  • NoClassDefFoundError :无法加载某个Class
  • StackOverflowError :虚拟机栈溢出

Exception则是运行时的错误,它可以被捕获并处理。某些异常是应用程序逻辑处理的一部分,应该捕获并处理。
例如:?

  • NumberFormatException:数值类型的格式错误
  • FileNotFoundException:未找到文件
  • SocketException :读取网络失败

还有一些异常是程序逻辑编写不对造成的, 应该修复程序本身。例如:

  • NullPointerException: 对某个nu1l 的对象调用方法或字段
  • IndexOutOfBoundsException ?:数组索引越界

Exception又分为两大类:

  • RuntimeException以及它的子类;
  • 非RuntimeException(包括( IOException 、ReflectiveOperationException等)

?异常的捕获:

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

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

package com.ztt.Demo01;

import java.util.Scanner;

//编译错误:语法错误,编译器报错
//异常:运行期间,由于客观原因导致的运行“错误”
public class demo01 {
	public static void main(String[] args) {
		try (Scanner in=new Scanner(System.in)){
			//获取输入是,可能产生InputMismatchException
			int n1=in.nextInt();
			int n2=in.nextInt();
			
			//计算除法时,可能产生ArithmeticException
			System.out.printf("%d÷%d=%d",n1,n2,n1/n2);
			
		} 
		
	}
}

运行结果:

a
Exception in thread "main" java.util.InputMismatchException
	at java.base/java.util.Scanner.throwFor(Scanner.java:939)
	at java.base/java.util.Scanner.next(Scanner.java:1594)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
	at com.ztt.Demo01.demo01.main(demo01.java:11)

5 0
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.ztt.Demo01.demo06.main(demo06.java:23)

package com.ztt.Demo01;

public class demo02 {
	public static void main(String[] args) {

		int[] ns = { 11,12,13,14,15 };
		
		System.out.println(ns[0]);
		System.out.println(ns[ns.length - 1]);
		
		//由于下标超出范围,产生数组下标越界ArrayIndexOutOfBoundsException
		// System.out.println(ns[99]);
		
		String s ="但使龙城飞将在";
		System.out.println(s.charAt(0));
		System.out.println(s.charAt( s.length()-1));
		
		//由于下标超出范围,产生字符串下标越界stringIndexOutOfBoundsException
		System.out.println(s.charAt(99));
	}

}

运行结果:

11
15
但
在
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: index 99, length 7
	at java.base/java.lang.String.checkIndex(String.java:4561)
	at java.base/java.lang.StringUTF16.checkIndex(StringUTF16.java:1624)
	at java.base/java.lang.StringUTF16.charAt(StringUTF16.java:1421)
	at java.base/java.lang.String.charAt(String.java:1515)
	at com.ztt.Demo01.demo02.main(demo02.java:19)
package com.ztt.Demo01;

import java.util.Random;

public class demo03 {

	public static void main(String[] args) {
		
		int[] ns = null;
		
		//试图访问一个为null的数组时,会产生
		//空指针异常NullPointerException
		//System.out.println(ns.length);
		//System.out.println(ns[0]);
		
		//试图访问一个为null的对象时,会产生
		//NullPointerException
		String s = null;
		System.out.println(s.trim());
		
		Random rand = null;
		if(3 >5){
			rand = new Random();
		}
		System.out.println(rand.nextBoolean());
	}

}

运行结果:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.trim()" because "s" is null
	at com.ztt.Demo01.demo03.main(demo03.java:19)
package com.ztt.Demo01;

public class demo04 {
	public static void main(String[] args) {
		doSth();//第一次调用
	}
	
	//引发StackOverflowError堆栈溢出
	private static void doSth() {
		//无限层次循环
		doSth();
	}
}

运行结果:

Exception in thread "main" java.lang.StackOverflowError
	at com.ztt.Demo01.demo04.doSth(demo04.java:11)
	at com.ztt.Demo01.demo04.doSth(demo04.java:11)
	at com.ztt.Demo01.demo04.doSth(demo04.java:11)
	at com.ztt.Demo01.demo04.doSth(demo04.java:11)
	at com.ztt.Demo01.demo04.doSth(demo04.java:11)
	at com.ztt.Demo01.demo04.doSth(demo04.java:11)
	at com.ztt.Demo01.demo04.doSth(demo04.java:11)
package com.ztt.Demo01;

public class demo05 {

	public static void main(String[] args) {
		// OutOfMemoryError:内存溢出
		// 对内存申请大容量空间,内存不足时
		byte[] arr1=new byte[2147483647];
		byte[] arr2=new byte[2147483647];
		byte[] arr3=new byte[2147483647];
	}

}

运行结果:

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at com.ztt.Demo01.demo05.main(demo05.java:8)
package com.ztt.Demo01;


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

public class demo06 {
	public static void main(String[] args) {
		//try:包围可能产生异常的代码块,如果产生异常,系统会根据异常产生的原因,创建一个异常对象
		//catch:捕获异常,处理异常
		try (Scanner in=new Scanner(System.in)){
			//获取输入是,可能产生InputMismatchException
			
			//输入非法的内容:a
			//JVM创建一个InputMismatchException类型的异常对象,并抛出
			//程序会从try块退出
			
			int n1=in.nextInt();//输入a
			
			int n2=in.nextInt();
			
			//计算除法时,可能产生ArithmeticException
			System.out.printf("%d÷%d=%d",n1,n2,n1/n2);
		}catch(NullPointerException ex) {
			System.out.println("哎呦,空指针了!");
		}catch(InputMismatchException ex) {
			System.out.println("哎呦,输入错误了!");
		}
	}
}

运行结果:

a
哎呦,输入错误了!

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