在java中,异常对象都是派生于Throwable类的一个实例,并且当java中的内置异常类不能满足需求时,用户可以创建自己的异常类。
1.Throwable有两个重要的子类:Exception和 Error。Error描述了java运行时系统内部错误和资源耗尽错误。不由程序进行捕获或处理,当error发生时,程序将会停止。如OutOfMemoryError(当JVM在为对象分配内存空间时,剩余的空间不够,同时也没有可以释放的内容时,会发省这样的错误)。
Exception是程序本身可以处理的异常,分为RuntimeException和非RuntimeException。
2.Unchecked Exception和Checked Exception。
其中Error和RuntimeException及它们的子类为不可查异常(编译器不要求强制处置的异常)。
除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常(编译器要求必须处置的异常)。
3.java中异常处理方式分为抛出异常和捕获异常。
抛出异常分为隐式声明抛出和显示声明抛出。
由于RuntimeException不可查,系统将自动抛出异常,允许程序方法不作任何声明抛出或处理,直接交给调用该方法的地方处理,程序能编译通过,不会对可能产生异常的代码行给出提示,即隐式抛出。
对于所有可查异常,要么显式抛出异常,要么捕捉异常。
4.自定义异常
public class MyException extends Exception{
/**
* 自定义可查异常类
*/
private static final long serialVersionUID = 1L;
public MyException() {
}
public MyException(String message) {
super(message);
}
}
处理异常方式如下:
public class Test {
/**
* 处理两数相除,抛出一个MyException异常,当除数为0时,会创建异常对象,提示信息为"除数不能为0"
* @param a 被除数
* @param b 除数
* @throws MyException 交给上层调用者处理该异常
*/
public void divide(int a , int b)throws MyException{
if(b==0)throw new MyException("除数不能为0");
else {
System.out.println(a/b);
}
}
/**
* 调用divide()方法,并且捕获异常
*/
public void compte1(){
int a = 1;
int b = 0;
try {
divide(a,b);
} catch (MyException e) {
e.printStackTrace();
}
}
/**
* 调用divide()方法,抛出异常不做处理,交给更上一层处理
* @throws MyException
*/
public void compte2() throws MyException{
int a = 1;
int b = 0;
divide(a,b);
}
public static void main(String args[]){
//new Test().compte1();
try {
new Test().compte2();
} catch (MyException e) {
e.printStackTrace();
}
}
}
下面是一个小作业,曾经在慕课网上学习java时老师留下的作业
下面贴出代码:
public class Demo {
/**
* 用户根据名称或者序号查找图书
*/
//0-语文 1-数学 2-英语
static String books[] = {"语文" , "数学" , "英语"};
static Scanner scan = null;
/**
* 根据命令选择查找图书的方式
* @param order 键盘输入的命令
* @throws OrderException 抛出命令错误异常
* @throws BookException 抛出找不到图书异常
*/
public static void orderManager (int order)throws OrderException, BookException{
if(order!=1 && order!=2){
throw new OrderException("命令不存在");
}
if(order ==1){ //根据名称查找
System.out.println("输入图书名称");
scan = new Scanner(System.in);
String key = scan.nextLine();
searchByName(key);
}
if(order ==2){ //根据序号查找
System.out.println("输入图书序号");
scan = new Scanner(System.in);
int index = scan.nextInt();
searchById(index);
}
}
private static void searchById(int index) throws BookException {
if(index<0 || index>books.length-1 ){
throw new BookException("该序号的图书不存在");
}else{
System.out.println(index + books[index]);
}
}
private static void searchByName(String key) throws BookException {
int i = 0;
for(i = 0;i<books.length;i++){
if(key.equals(books[i]))break;
}
if(i>=books.length){
throw new BookException("改名称的图书不存在");
}else{
System.out.println(i + books[i]);
}
}
public static void main(String args[]){
while(true){
System.out.println("输入命令:1-按名称查找 2-按序号查找");
scan = new Scanner(System.in);
int order = scan.nextInt();
try {
orderManager(order);
} catch (OrderException e) {
System.out.println("改命令不存在");
continue;
} catch (BookException e){
System.out.println("该图书不存在");
continue;
}
}
}
}
public class OrderException extends Exception{
/**
* 命令错误异常
*/
private static final long serialVersionUID = 1L;
public OrderException(){}
public OrderException(String message){
super(message);
}
}
public class BookException extends Exception{
/**
* 找不到图书异常
*/
private static final long serialVersionUID = 1L;
public BookException(){}
public BookException(String message){
super(message);
}
}