Java入门-异常机制

java异常机制

异常概念

在Java中,异常处理(exception handling) : java语言或者程序员开发提供的一种机制,当有不正常的情况发生时,可以发出信号。这种发出信号的过程被称为抛出异常(throwing an exception)。

java异常体系

img

Error

Error类对象由 Java虚拟机(JVM)生成并抛出,大多数错误与代码编写者所执行的操作无关。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。这类异常不是我们开发的重点。

Exception

Exception是指程序本身可以处理的异常。一般是我们在开发过程中没有考虑全面或者一些意外的情况,比如除法中除数不能为零,输入一个非数字的字符串无法转换为数字的异常等。Exception异常又分为运行时异常和可检查异常。

运行时异常(RuntimeException)

RuntimeException是Exception的子类,RuntimeException类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和ArrayIndexOutOfBoundException。

可检查异常(Exception)

可检查异常是指继承Exception类的子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。也就是大家在IDE工具写某些代码提示你需要处理的异常。比如 Thread.sleep(100)等。

异常处理流程

try …catch … finally

try

检查语句块是否有异常

img

catch

根据监测出的异常类型进行捕获。

img

finally

不管是否抛出异常都要执行某一程序的机制。

异常处理的两种形式:

try… catch 形式: 检查异常,捕获异常

try…finally 形式: 检查异常,有无异常一定执行

程序案例:

int x = 3;
int y = 0;

try{
	int p = x / y;
}catch (ArithmeticException e) {
	e.printStackTrace();
}finally {
	System.out.println("finally代码块...");
}

程序运行结果:

finally代码块...
java.lang.ArithmeticException: / by zero
at example.E1.main(E1.java:10)

throws

在方法上声明抛出的可检查异常的类型。当我们由于某种原因不想/不能进行异常处理时,我们可以声明本方法有异常,告诉调用者需要处理。

public void run() throws IOException{

    //方法体

}

throw

使用throw抛出异常对象,注意throw是一个动作,一般在方法体里使用,抛出正真的异常对象。

public void deleteById(int id) {

	if (id < 0) throw new RuntimeException("id不能为负数");

}

提示:如果抛出的是可检出异常类型则需要在方法上声明异常的类型。

自定义异常

项目开发中仅仅使用java给定的异常(类型),对于不同的项目来讲远远不够。为了提高项目的异常处理能力,一般需要自定义异常对象。

自定义异常

自定义异常非常简单,只需要继承某个异常类(一般选择继承RuntimeException)。

public class MyException extends RuntimeException{

 public MyException(String msg){
   super(msg);
 }
}

异常相关问题

在使用异常时有几个问题需要注意:

(1) 在继承关系时,子类不得比父类抛出更多,类型更大的异常。

(2) 自定义异常的命名一定要清晰,见名知意。

(3) 异常捕获一般配合日志。

异常使用案例:

使用自定义的异常完成用户权限验证。

需求

用户登录系统时会输入用户名和密码,本实例通过模拟用户在登录时和运行程序中的验证功能:

  • 预设不同用户的用户名、密码和权限。

  • 检查用户的用户名是否正确,正确用户允许进行其它操作。失败登录能够捕获错误原因(根据不同的异常抛出对象决定)。

  • 成功登录用户进行操作时还需要检查用户的权限,如果权限正确,模拟显示用户的操作,否则抛出异常显示用户权限不足。

分析

系统设计中的主要几个问题分析:

  • 使用数组预设多个用户对象,用户对象中记录用户的用户名&密码和权限。

  • 定义多种异常类,可以定义一个异常父类 (UserException), 再分别定义不同的异常类继承UserException, 比如UsernameEmptyExeption(用户名为空异常),UsernameIsNotExistException(用户不存在异常), InvalidUserException(无效的用户),PermissionDenied(权限不足异常)。

  • 通过不同的异常处理流程捕获不同的异常。

实现思路

定义用户(User)类

public class User {
	private String username;
	private String password;
	private String name;
	private String privilege;
}

定义异常超类

/*
 * User异常类超类
 * @author Administrator
 *
 */

public class UserException extends RuntimeException {

	public UserException(String message) {
		super(message);		
	}

}

定义异常子类例如InvalidUserException

public class InvalidUserException extends UserException {
	public InvalidUserException(String message) {
		super(message);
	}
}

登录异常捕获类(片段)

try {
	//检查登录代码
	} catch (UsernameEmptyExeption e1) {
			System.out.println(e1.getMessage());
	} catch (InvalidUserException e2) {
			System.out.println(e2.getMessage());
	}
	:
	:

登录异常捕获类(片段)

try {
	//检查登录代码
	} catch (UsernameEmptyExeption e1) {
			System.out.println(e1.getMessage());
	} catch (InvalidUserException e2) {
			System.out.println(e2.getMessage());
	}
	:
	:
  • 34
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值