异常Throwable分为Error和Exception,Exception分为RuntimeException和其他
Error:通过代码无法解决的严重问题,比如内存溢出
编译时异常,java编译器强制要求方法必须声明可能抛出的异常,或者在调用可能抛出这些异常方法的时显式捕获他们。
RuntimeException类,运行时异常,不要求必须声明抛出运行时异常,因为他们是编程错误,必须在编译阶段避免。
Throws声明异常
throws在方法签名中使用他来声明该方法可能抛出的异常类型,告知调用者需要处理或再次声明这些异常。常用格式如下,在方法名后写异常类名,如果有多个用逗号隔开:
public static void 方法名() throws 异常类名1 ,异常类名2,…{}
throw抛出异常
常用在方法体里面,用于抛出异常,常用格式如下
throw new 异常类名();
try-catch 抛出异常
用法格式如下:
try { 可能出现异常的代码;}
catch(异常类名 变量名) {异常的处理代码;}
当有多个catch时可以一直向下写,如果异常之间有继承关系,父类要写在最后
Throwable成员方法
toString():返回此可抛出的简短描述 System.out.println(e.toString());
getMessage():返回此 throwable 的详细消息字符串System.out.println(e.getMessage());
printStackTrace():把异常的错误信息输出在控制台 e.printStackTrace();
自定义异常
当Java中提供的异常不能满足我们的需求时使用自定义异常解决,以下题为例
编写一个计算N个整数平均值的程序。程序应该提示用户输入N的值,如何必须输入所有N个数。如果用户输入的值是一个负数,则应该抛出一个异常并捕获,提示“N必须是正数或者0”。并提示用户再次输入该数(自定义异常)。
//首先编写异常类
//1、定义异常类NumberOutOfIndexException
//2、写继承关系,extends RuntimeException
public class NumberOutOfIndexException extends RuntimeException{
//3、提供空参构造,继承父类的空参构造
public NumberOutOfIndexException() {
super();
}
//4、提供带参构造,继承父类的有参构造
public NumberOutOfIndexException(String message) {
super(message);
}
}
import java.util.Scanner; //使用键盘录入
import java.util.InputMismatchException; //使用输入异常
class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("你想计算几个数的平均数 ");
int n = 0;
while (true) {
try { //使用try...catch方式
n = sc.nextInt();
if (n < 0) { //如果输入的数小于0就使用自定义异常
throw new NumberOutOfIndexException(); //throw抛出异常
}
break;
} catch (InputMismatchException e) {
System.out.println("请输入整数"); //防止输入小数造成运行中断使用输入异常
sc.next();
} catch (NumberOutOfIndexException e) {
System.out.println("N为正整数或0");
}
}
double sum = 0; //使用double,平均数大概率为小数
int m;
if (n == 0) { //输入为0就不用计算平均数了,为0
System.out.println("平均值为0");
} else {
for (int i = 1; i < n + 1; i++) {
while (true) {
try {
System.out.println("请输入第" + i + "个数");
m = sc.nextInt();
if (m < 0) {
throw new NumberOutOfIndexException();
}
sum = sum + m;
break;
} catch (InputMismatchException e) {
System.out.println("请输入整数");
sc.next();
} catch (NumberOutOfIndexException e) {
System.out.println("N为正整数或0");
}
}
}
double avg = sum / n;
System.out.println("平均值为:"+avg);
}
}
}
最终运行结果如下:
你想计算几个数的平均数
2
请输入第1个数
0.3
请输入整数
请输入第1个数
-3
N为正整数或0
请输入第1个数
4
请输入第2个数
5
平均值为:4.5
Process finished with exit code 0