Java异常处理

Java异常处理

异常

异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。

Java异常处理关键字

try、catch. finally、throw、throws

捕获异常声明异常抛出异常
try执行可能产生异常的代码throwsthrow
catch捕获异常声明方法可能要抛出的各种异常手动抛出异常
finally无论是否发生异常,代码总能执行
try catch处理异常分为三种情况
  1. 程序正常执行。
  2. 出现异常,在catch中找到对应的匹配项,处理并停掉程序。
  3. 在catch里面的异常不匹配的时候也会停掉程序。

常见的异常类型

异常类型说明
Exception异常层次结构的父类
ArithmeticException算数错误情形,如以零作为除数
ArrayOutOfBoundsException数组下标越界
NullPointerException尝试访问null对象成员
ClassNotFoundException不能加载所需的类
IllgalArgumentException无法接收到非法参数
ClassCastException对象强制类型转换出错
NumberFormatException数字格式转换异常,比如把"aba"转换为数字
try catch异常处理案例:
package unusual;

import java.util.InputMismatchException;
import java.util.Scanner;

import org.junit.Test;

/**
 * 测试异常
 * 
 * @author XRY
 *
 */
public class TestException {
    Scanner scan = new Scanner(System.in);
    int numOne;
    /**
     * 没有用异常处理时
     */
    @Test
    public void testOne() {
        System.out.println("请输入被除数");
        
        if(scan.hasNextInt()) {
            int numOne = scan.nextInt();
            System.out.println("请输入除数");
            int numTwo = scan.nextInt();
            System.out.println(String.format("%d / %d = %d", numOne, numTwo, numOne / numTwo));
            System.out.println("感谢使用本程序");
        }else {
            System.out.println("你输入的不是数字!!");
        }

    }
    
    
    /**
     * 加入try-catch后处理
     */
    @Test
    public void testTwo() {
        try {
            System.out.println("请输入被除数。");
            int numOne = scan.nextInt();
            System.out.println("请输入除数。");
            int numTwo = scan.nextInt();
            System.out.println(String.format("%d / %d = %d", numOne, numTwo, numOne / numTwo));
        //捕获输入不匹配的异常并处理
        } catch (InputMismatchException e) {
            // TODO Auto-generated catch block
            //e.printStackTrace();
            System.out.println("输入的不是数字!!");
        }catch (ArithmeticException e) {
            System.out.println("除数不能为零");
        }
        System.out.println("感谢使用本程序");
    }
}

当在处理异常但不知道怎么判断是什么异常时,可以使用它的父类Exception

package unusual;

import java.util.InputMismatchException;
import java.util.Scanner;

import org.junit.Test;

/**
 * 测试异常
 * 
 * @author XRY
 *
 */
public class TestException {
    Scanner scan = new Scanner(System.in);
    int numOne;
    /**
     * 没有用异常处理时
     */
    @Test
    public void testOne() {
        System.out.println("请输入被除数");
        
        if(scan.hasNextInt()) {
            int numOne = scan.nextInt();
            System.out.println("请输入除数");
            int numTwo = scan.nextInt();
            System.out.println(String.format("%d / %d = %d", numOne, numTwo, numOne / numTwo));
            System.out.println("感谢使用本程序");
        }else {
            System.out.println("你输入的不是数字!!");
        }

    }
    
    
    /**
     * 加入try-catch后处理
     */
    @Test
    public void testTwo() {
        try {
            System.out.println("请输入被除数。");
            int numOne = scan.nextInt();
            System.out.println("请输入除数。");
            int numTwo = scan.nextInt();
            System.out.println(String.format("%d / %d = %d", numOne, numTwo, numOne / numTwo));
        //捕获输入不匹配的异常并处理
//      } catch (InputMismatchException e) {
//          // TODO Auto-generated catch block
//          //e.printStackTrace();
//          System.out.println("输入的不是数字!!");
//      }catch (ArithmeticException e) {
//          System.out.println("除数不能为零");
        }catch(Exception e) {
            System.out.println("程序出错啦,请联系管理员....");
            
        //不管程序是否出现异常,都会执行finally里面的内容
        }finally {
        //停止Jvm 1是正常退出, 0是非正常退出
        System.exit(1);
        System.out.println("感谢使用本程序");
        }
    
    }
    
}

注意:在try-catch中如果含return,还是会执行finally里面的内容。

finally唯一不执行的情况是:

System.exit(1)----强行关闭虚拟机。参数1、0都是可以的,1表示正常退出,0表示非正常退出。

System.exit 被调用后,在虚拟机退出前会执行两个清除任务。

第一,它会执行所有通过 Runtime.addShutdownHook 注册的 shutdown hooks 它能有效的释放JVM之外的资源。

第二,执行清除任务,运行相关的 finalizer 方法终结对象。


自定义异常

当JDK中的异常类型不能满足程序的需要的时候,可以自定义异常类。

使用自定义异常的步骤:

  1. 定义异常类 :继承Throwable类、继承Exception 或者RuntimeExcept。
  2. 编写构造方法,继承父类的实现,继承JDK Exception。
  3. 实例化自定义异常对象。
  4. 使用throw抛出。

Exception类的层次


//自定义异常类
package unusual.practice;

public class AgeException extends Exception {
	public AgeException(String msg) {
		super(msg);
	}
}

//实例化自定义异常对象并通过throw抛出异常
package unusual.practice;
/**
 * 对年龄进行判断
 * @author XRY
 *
 */
public class AgeTrow {
	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) throws AgeException {
		//判断年龄,如果在1-100直接赋值,否则抛出异常
		if(age < 0 || age >100) {
			throw new AgeException("输入的年龄不符!!");
		}else {
			this.age = age;
		}

	}
	
}
//测试自定义异常
package unusual.practice;

import java.util.Scanner;

public class TestAgeException {
	public static void main(String[] args) throws AgeException {
		AgeTrow ae = new AgeTrow();
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入你的年龄!");
		int num = scan.nextInt();
		ae.setAge(num);
		System.out.println("你的年龄是" + ae.getAge());
		
	}
}
//输出结果:
请输入你的年龄!
120
Exception in thread "main" unusual.practice.AgeException: 输入的年龄不符!!
	at unusual.practice.AgeTrow.setAge(AgeTrow.java:17)
	at unusual.practice.TestAgeException.main(TestAgeException.java:11)

更多异常处理内容,请看这里!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值