### 异常是 Java 处理错误(运行时错误)的机制,出现错误的地方,Java 会自动生成一个异常对象,该对象包含了异常的各种信息,并且抛出该对象,交给可以处理该错误的代码来进行处理。 ### 异常类 最顶端的类是 Throwable,是所有异常类的根结点。 Throwable有两个直接子类:Error 和 Exception。 Error 表示系统错误,程序无法解决,Exception 指程序运行时出现的错误,程序可以处理,所有的异常类都存放在java.lang包中。 Error 常见的子类包括 VirtualMachineError、AWTError、IOError。 Exception 常见的子类主要包含 IOException 和 RuntimeException,IOException 存放在 java.io 包中,RuntimeException 存放在java.lang 包中。 IOException 的常用子类包括FileLockInterruptionException、FileNotFoundException、FilerException,这些异常通常都是在处理 IO 流进行文件传输时发生的错误。 RuntimeException 常用子类: - ArithmeticException:表示数学运算异常。 - ClassNotFouneException:表示类未定义异常。 - IllegalArgumentException:表示参数格式错误异常。 - ArrayIndexOutOfBoundsException:表示数组下标越界异常。 - NullPointerException:表示空指针异常。 - NoSuchMethodException:表示方法未定义异常。 - NumberFormatException:表示将其他数据类型转为数值类型时的不匹配异常。 ### 综合练习 使用本章所学知识,重点包括封装、继承、多态、抽象、接口来完成一个汽车查询系统。 需求描述:共有3种类型的汽车:小轿车、大巴车、卡车,其中小轿车是4座、大巴车是53座、卡车是2座,要求使用封装、继承、抽象来完成车辆的定义。 可以对汽车信息作出修改,卡车可以运货但是载重量不能超过12吨,使用自定义异常来处理错误,小轿车和大巴车没有此功能,要求使用接口来实现。
MyException.java
public class MyException extends Exception { public MyException(String error) { super(error); } }
Test.java
public class Test { public static void main(String[] args) throws Exception { test(); } public static void test() throws Exception{ String str = "Java"; int num = Integer.parseInt(str); } }
Test2.java
public class Test2 { public static void main(String[] args) { Test2 test2 = new Test2(); try { System.out.println(test2.add("10")); } catch (MyException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public int add(Object object) throws MyException { //判断object是否为整数 if(object instanceof Integer) { int num = (int)object; return num++; }else { String error = "传入的参数不是整数类型"; throw new MyException(error); } } }
Bus.java
package demo; public class Bus extends Car { public Bus(String name, String color) { super(name, color); } @Override public String seatNum() { // TODO Auto-generated method stub return "53座"; } }
Car.java
package demo; public abstract class Car { private String name; private String color; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public abstract String seatNum(); public Car(String name, String color) { super(); this.name = name; this.color = color; } }
CarException.java
package demo; public class CarException extends Exception { public CarException(String error) { super(error); } }
Container.java
package demo; public interface Container { public int getweight(); }
Sedan.java
package demo; public class Sedan extends Car { public Sedan(String name, String color) { super(name, color); } @Override public String seatNum() { // TODO Auto-generated method stub return "4座"; } }
Test.java
package demo; import java.util.Scanner; public class Test { private static Scanner scanner; private static Sedan sedan; private static Bus bus; private static Truck truck; private static Car[] cars; static { scanner = new Scanner(System.in); sedan = new Sedan("小轿车","黑色"); bus = new Bus("大巴车","绿色"); truck = new Truck("卡车","蓝色",2); cars = new Car[3]; cars[0] = sedan; cars[1] = bus; cars[2] = truck; } public void showCars() { System.out.println("车辆名称 车辆颜色 座位数 载重量"); Car car = null; for(int i = 0; i < cars.length;i++) { car = cars[i]; if(car instanceof Sedan) { Sedan sedan = (Sedan)car; System.out.println(sedan.getName()+" "+sedan.getColor()+" "+sedan.seatNum()); } if(car instanceof Bus) { Bus bus = (Bus)car; System.out.println(bus.getName()+" "+bus.getColor()+" "+bus.seatNum()); } if(car instanceof Truck) { Truck truck = (Truck)car; System.out.println(truck.getName()+" "+truck.getColor()+" "+truck.seatNum()+" "+truck.getweight()); } } } public static void main(String[] args) { Test test = new Test(); test.showCars(); } }
Truck.java
package demo; public class Truck extends Car implements Container { private int weight; public Truck(String name,String color,int weigth) { super(name,color); this.weight = weigth; } @Override public String seatNum() { // TODO Auto-generated method stub return "2座"; } @Override public int getweight() { // TODO Auto-generated method stub return this.weight; } }