异常的概念
异常是在运行过程中代码序列在产生一种例外情况
异常不是错误
Throwable有两个子类
一个是Error(错误),异常Exception
Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。
Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 不是 Exception。
异常是在运行过程中代码序列在产生一种例外情况
一般情况在,使用if...else..来控制异常
Java异常处理通过5个关键字控制:
try、catch、throw、throws和finally
如果异常未被处理(未被捕获)程序中止运行并报错
多重catch块
某些情况下,try块中的代码也可能引发多种异常
定义多个catch字句,每个字句捕获一种类型的异常,每个catch各司其职
throw
又是需要明确的引发一个异常,java语言可以用throw语句显式地引发异常(只抛出不解决)
常见的异常
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException
练习
自定义方法sanj,其中有成员x,y,z作为三边长,构造方法sanj(a,b,c)分别给x,y,z赋值,方法求面积getarea和显示三角形信息(三个边长)showInfo,这2个方法中当三条边能构成一个三角形时要抛出自定义异常notsanjiaowxception,否则显示正确信息。在另外一个类中的方法中构造一个sanj对象(三边为命令行输入的三个整数),显示三角形信息和面积,要求捕获异常。
package org.ty.Demo21_12_14;
import java.util.Scanner;
class Sanj {
int x, y, z;
public Sanj(int x, int y, int z) {
super();
this.x = x;
this.y = y;
this.z = z;
}
public void getZhouc() throws NotSanjiaoException {
if (x > 0 && y > 0 && z > 0) {
if ((x + y) > z && (x + z) > y && (y + z) > x) {
System.out.println("三角形周长为:" + (x + y + z));
} else {
throw new NotSanjiaoException("不满足两边之和大于第三边", x, y, z);
}
} else {
throw new NotSanjiaoException("x,y,z不能为负数", x, y, z);
}
}
public void getInfo() throws NotSanjiaoException {
if (x > 0 && y > 0 && z > 0) {
if ((x + y) > z && (x + z) > y && (y + z) > x) {
System.out.println("三角形的三边:" + x + "," + y + "," + z);
} else {
throw new NotSanjiaoException("不满足两边之和大于第三边", x, y, z);
}
} else {
throw new NotSanjiaoException("x,y,z不能为负数", x, y, z);
}
}
public void getarea(double a, double b, double c) {
double p = (a + b + c) / 2;
double area = Math.sqrt(p * (p - a) * (p - b) * (p - c));
System.out.println("三角形的面积为:" + area);
}
}
class NotSanjiaoException extends Exception {
int x, y, z;
String s;
public NotSanjiaoException(String string, int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
s = string;
}
public String getMessage() {
return "不能构成三角形," + s + "," + "输入的三边为" + x + "," + y + "," + z;
}
}
public class Demo06 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入三边的长度");
System.out.print("a=");
int a = sc.nextInt();
System.out.print("b=");
int b = sc.nextInt();
System.out.print("c=");
int c = sc.nextInt();
Sanj s = new Sanj(a, b, c);
try {
s.getZhouc();
s.getInfo();
s.getarea(a, b, c);
} catch (NotSanjiaoException e) {
e.printStackTrace();
}
}
}
2021/12/14