【Java学习笔记】IO流之异常

目录

1.异常的定义

2.异常的分类

2.1 Error

2.2 Exception

3.异常的处理方法

3.1 JVM的默认处理方案 

3.2 try...catch的方式处理异常

 3.3 throws的方式处理异常 

4.throw和throws的区别

5.final、finally和finalize的区别

6.自定义异常


1.异常的定义

异常就是Java程序在运行过程中出现了不正常的情况。

2.异常的分类

从上图可以看到异常的分类有两种:

2.1 Error

这种问题一般都是很严重的,我们不做处理!例如:内存溢出

2.2 Exception

  • 运行时异常:RuntimeException及其子类都是运行时异常,这种异常不用处理,编译会通过,遇到这种异常是需要修改代码的!
  • 编译时异常:除了RuntimeException及其子类,Exception中的其它子类都是编译时异常,这种异常必须要处理,否则编译不能通过!

3.异常的处理方法

3.1 JVM的默认处理方案 

下面先来看一段代码:

package com.hw.exception;

public class ExceptionDemo1 {
	public static void main(String[] args) {
		method1();
	}

	private static void method1() {
		int a = 10;
		int b = 0;
		System.out.println(a/b);
		System.out.println("==========end==========");
	}
}

运行之后出现异常ArithmeticException,如下所示,可以看到,异常后面的语句并没有输出在控制台上! 

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.hw.exception.ExceptionDemo1.method1(ExceptionDemo1.java:11)
	at com.hw.exception.ExceptionDemo1.main(ExceptionDemo1.java:5)

JVM发现运算违反了数学运算规则,java将这种常见的问题进行描述,并封装成了对象叫做ArithmeticException。当除0运算发生后,JVM将该问题打包成了一个异常对象,并将对象抛给调用者main函数,new ArithmeticException("/by zero");

main函数收到这个问题时,有两种处理方式:

  • 自己将该问题处理,然后继续运行
  • 自己没有针对的处理方式,只有交给调用main的JVM来处理JVM有一个默认的异常处理机制,就将该异常进行处理,并将该异常的名称、异常的信息、异常出现的位置打印在了控制台上,同时将程序停止运行!

上面的代码使用的是JVM的默认处理方案!

下面我们来看下如何使用try..catch和throws处理异常!

3.2 try...catch的方式处理异常

try {
    可能出现问题的代码;
}catch(异常名 变量) {
    针对问题的处理;
}finally {
    释放资源;
}

注意:
    try里面的代码越少越好;
    catch里面必须有内容;

使用try...catch处理上面3.1的代码,如下所示:

public static void main(String[] args) {
		// method1();
		method2();
}

private static void method2() {
	int a = 10;
	int b = 0;
	try {
		System.out.println(a/b);
	} catch (ArithmeticException e) {
		e.printStackTrace();
	}
	System.out.println("==========end==========");
}

运行结果如下:

java.lang.ArithmeticException: / by zero
	at com.hw.exception.ExceptionDemo1.method2(ExceptionDemo1.java:13)
	at com.hw.exception.ExceptionDemo1.main(ExceptionDemo1.java:6)
==========end==========

 3.3 throws的方式处理异常 

使用throws处理上面3.1的代码,如下:

// 尽量不要在main方法上throws抛出异常
public static void main(String[] args) {
	// method1();
	// method2();
	try {
		method3();
	} catch (ArithmeticException e) {
		e.printStackTrace();
	}

	System.out.println("==========end==========");
}

private static void method3() throws ArithmeticException {
	int a = 10;
	int b = 0;
	System.out.println(a/b);
}

运行结果如下所示: 

java.lang.ArithmeticException: / by zero
	at com.hw.exception.ExceptionDemo1.method2(ExceptionDemo1.java:13)
	at com.hw.exception.ExceptionDemo1.main(ExceptionDemo1.java:6)
==========end==========

4.throw和throws的区别

throws

  • 用在方法声明后面,跟的是异常类名
  • 可以跟多个异常类名,用逗号隔开
  • 表示抛出异常,由该方法的调用者来处理
  • throws表示出现异常的一种可能性,并不一定会发生这些异常

throw

  • 用在方法体内,跟的是异常对象名
  • 只能抛出一个异常对象名
  • 表示抛出异常,由方法体内的语句处理
  • throw则是抛出了异常,执行throw则一定抛出了某种异常

需求:举例分别演示编译时异常对象和运行时异常对象的抛出!

4.1 运行时异常对象的抛出,代码如下:

public static void main(String[] args) {
	method1();
}

// 演示运行时异常对象的抛出
private static void method1() {
	int a = 10;
	int b = 0;
	if (b == 0) {
		throw new ArithmeticException("除数为0!");
	} else {
		System.out.println(a / b);
	}
}

4.2 编译时异常对象的抛出,如下所示:

 

5.final、finally和finalize的区别

final:最终的意思,可以修饰类,成员变量,成员方法;

  • 修饰类,类不能被继承;
  • 修饰变量,变量是常量;
  • 修饰方法,方法不能被重写。

finally:是异常处理的一部分,用于释放资源。一般来说,代码肯定会执行,特殊情况:在执行到finally之前JVM退出了!

finalize:是Object类的一个方法,用于垃圾回收!

6.自定义异常

java不可能对所有的情况都考虑到,所以,在实际的开发中,我们可能需要自己定义异常。而我们自己随意的写一个类,是不能作为异常类来看的,要想你的类是一个异常类,就必须继承自Exception或者RuntimeException。

需求:自定义异常,考试成绩必须在0-100之间!

自定义一个异常类MyException.java,代码如下:

package com.hxs.exception;

/**
 * 自定义异常类
 * 
 * @author HW
 * 
 */
public class MyException extends Exception {

	public MyException() {
	}

	public MyException(String message) {
		super(message);
	}

	public MyException(Throwable cause) {
		super(cause);
	}

	public MyException(String message, Throwable cause) {
		super(message, cause);
	}
}

Teacher.java代码如下:

package com.hxs.exception;

public class Teacher {
	public void check(int score) throws MyException {
		if(score < 0 || score > 100) {
			throw new MyException("输入的学生分数必须在0-100之间!");
		} else {
			System.out.println("输入的学生分数没有问题!");
		}
	}
}

自定义异常测试类TeacherTest.java代码如下:

package com.hxs.exception;

import java.util.Scanner;

/**
 * 自定义异常测试类
 * 
 * @author HW
 * 
 */
public class TeacherTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入学生的成绩:");
		int score = sc.nextInt();
		
		Teacher teacher = new Teacher();
		try {
			teacher.check(score);
		} catch (MyException e) {
			e.printStackTrace();
		}
	}
}

例如:输入一个大于100的成绩,会抛出自定义异常,如下:

猜你喜欢

转载自blog.csdn.net/weixin_44679832/article/details/105366037