Java 异常处理

64 阅读3分钟

什么是异常?

image.png

异常类的层次

image.png

Throw类常用方法

  1. public String getMessage():返回异常的简短描述信息。
  2. public String toString():返回异常的字符串表示形式,通常包括异常的类名和 getMessage() 方法返回的信息。
  3. public Throwable getCause():如果这个 Throwable 是由另一个 Throwable 引起的,这个方法会返回那个原因 Throwable
  4. public Throwable initCause(Throwable cause):用于设置异常的原因,通常在自定义异常类中使用。
  5. public void printStackTrace():将异常的堆栈跟踪打印到标准错误流。
  6. public void printStackTrace(PrintStream s):将异常的堆栈跟踪打印到指定的 PrintStream
  7. public void printStackTrace(PrintWriter s):将异常的堆栈跟踪打印到指定的 PrintWriter
  8. public void fillInStackTrace():填充当前 Throwable 对象的堆栈跟踪信息。
  9. public StackTraceElement[] getStackTrace():返回异常的堆栈跟踪元素数组。

三种异常

  1. Error

    • Error类表示程序运行时发生的严重问题,这些问题通常不是由程序逻辑错误引起的,而是系统级别的问题,比如内存不足(OutOfMemoryError)、线程死锁(ThreadDeath)等。
    • 错误通常不是由应用程序代码引起的,因此,它们通常不应该被应用程序捕获。在大多数情况下,错误会导致程序终止。
  2. Exception

    • Exception类表示程序运行时发生的异常情况,这些异常通常是由于程序逻辑错误引起的,比如文件未找到(FileNotFoundException)、数组越界(ArrayIndexOutOfBoundsException)等。
    • 异常可以通过使用try-catch块来捕获和处理,以防止程序因为未处理的异常而崩溃。
  3. RuntimeException

    • RuntimeExceptionException的一个子类,它表示运行时异常。这些异常通常是由程序中的逻辑错误引起的,比如空指针引用(NullPointerException)、类型转换错误(ClassCastException)、算术异常(ArithmeticException)等。
    • 运行时异常通常不需要显式地声明抛出(通过throws关键字),因为它们是程序逻辑错误的一部分,应该在编写代码时避免。但是,如果某些运行时异常在某些情况下是可恢复的,那么它们也应该被显式地抛出。

异常处理

基本结构

image.png

实际案例

WrongData异常类👇

public class WrongData extends Throwable{
	
}

Statisicable接口👇

public interface Statisticable {
	double average();
}

Score类👇

public class Score extends WrongData implements Statisticable {
	double[] s;

	public Score() {
		// TODO Auto-generated constructor stub
	}

	public Score(double[] s) {
		super();
		this.s = s;
	}

	public double[] getS() {
		return s;
	}

	public void setS(double[] s) {
		this.s = s;
	}

	@Override
	public double average() {
		int sum = 0;
		for (int i = 0; i < s.length; i++) {
			sum += s[i];
		}
		int average = sum / s.length;
		return average;
	}

	public void check() throws WrongData {
		for (int i = 0; i < s.length; i++) {
			if (s[i]>100||s[i]<0) {
				WrongData ERRORR = new WrongData();
				throw ERRORR;
			}
		}
	}
}

ps:check()方法用于检查数组元素是否合法,若不合法抛出自定义的异常类WrongData的对象ERROR

throws WrongData:这行代码声明方法可能会抛出 WrongData 异常。这意味着调用 check() 方法的代码必须处理这个异常。

ScoreTest测试类👇

public class ScoreTest extends Score {
    public static void main(String[] args) {
        double[] arr = {-20, 108, 88};
        Score example = new Score(arr);
        try {
            example.check();
            System.out.println("平均分为" + example.average());
        } catch (WrongData e) {
            // 输出异常信息
            System.out.println("分数错误" );
        }
    }
}