什么是异常?
异常类的层次
Throw类常用方法
public String getMessage():返回异常的简短描述信息。public String toString():返回异常的字符串表示形式,通常包括异常的类名和getMessage()方法返回的信息。public Throwable getCause():如果这个Throwable是由另一个Throwable引起的,这个方法会返回那个原因Throwable。public Throwable initCause(Throwable cause):用于设置异常的原因,通常在自定义异常类中使用。public void printStackTrace():将异常的堆栈跟踪打印到标准错误流。public void printStackTrace(PrintStream s):将异常的堆栈跟踪打印到指定的PrintStream。public void printStackTrace(PrintWriter s):将异常的堆栈跟踪打印到指定的PrintWriter。public void fillInStackTrace():填充当前Throwable对象的堆栈跟踪信息。public StackTraceElement[] getStackTrace():返回异常的堆栈跟踪元素数组。
三种异常
-
Error:
Error类表示程序运行时发生的严重问题,这些问题通常不是由程序逻辑错误引起的,而是系统级别的问题,比如内存不足(OutOfMemoryError)、线程死锁(ThreadDeath)等。- 错误通常不是由应用程序代码引起的,因此,它们通常不应该被应用程序捕获。在大多数情况下,错误会导致程序终止。
-
Exception:
Exception类表示程序运行时发生的异常情况,这些异常通常是由于程序逻辑错误引起的,比如文件未找到(FileNotFoundException)、数组越界(ArrayIndexOutOfBoundsException)等。- 异常可以通过使用
try-catch块来捕获和处理,以防止程序因为未处理的异常而崩溃。
-
RuntimeException:
RuntimeException是Exception的一个子类,它表示运行时异常。这些异常通常是由程序中的逻辑错误引起的,比如空指针引用(NullPointerException)、类型转换错误(ClassCastException)、算术异常(ArithmeticException)等。- 运行时异常通常不需要显式地声明抛出(通过
throws关键字),因为它们是程序逻辑错误的一部分,应该在编写代码时避免。但是,如果某些运行时异常在某些情况下是可恢复的,那么它们也应该被显式地抛出。
异常处理
基本结构:
实际案例:
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("分数错误" );
}
}
}