异常体系

Java中的异常机制

  • Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类。
    • Error错误,一般是指与虚拟机有关的问题,如系统崩溃等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此对于这类错误,Java编译器不去检查他们。通常遇到这类错误导致的应用程序中断,仅靠程序本身无法恢复和预防,建议让程序终止。
    • Exception异常表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
  • Exception又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception )。
    • RuntimeException:其特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try……catch捕获,也没有用throws抛出,还是会编译通过,如除数为零、错误的类型转换、数组越界访问和试图访问空指针等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。
    • 受检查的异常(IOException等):这类异常如果没有try……catch也没有throws抛出,编译是通不过的。这类异常一般是外部错误,例如文件找不到等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
    • 注意:Java语言中有RuntimeException这个异常类,但是并没有CheckedException这个异常类,只是宏观上把除了RuntimeException类以外的异常类都归属到受检查的异常(Checked Exception)中

异常处理方法

JVM默认处理异常的机制

  • main函数收到异常情况是,可以分为两种情况
    1. 自己处理,然后继续运行后面的代码
    2. 交给main方法的JVM处理,处理结果为:将异常的基本情况打印在控制台,结束进程。

程序员自己处理

  • try……catch……finally 处理异常后,继续执行后面的进程
    try{
    
      try 用来检测异常
    
      }catch(NullPointException e){
    
       可以有多个catch
    
      }catch(Exception e){
    
        catch 用来捕获异常
    
      }finally{
    
       finally用来释放资源
    
       如:关闭数据库、流
    
     }
    

``
(1) 注意一:try语句块不可以省略,catch/finally语句块至少二取其一,可以两个都要
(2) 注意二:try……catch……finally 语句中可以嵌套try……catch……finally 语句。

  • throws和throw关键字

    定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。
    编译时异常:必须抛出;运行时异常:也可以不处理,不抛出

    throws 和throw的区别:

    (1) throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常

    public static void main(String[] args) { 
    String s = "abc"; 
    if(s.equals("abc")) { 
      throw new NumberFormatException(); 
    } else { 
      System.out.println(s); 
    

    (2) throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常),当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。

    public class ThrowsThrow {
    
    public static void main(String[] args) {
       
       try {
       	read("g:/nihao.jpg");
       } catch (FileNotFoundException e) {
       	e.printStackTrace();
       }
       
    }
    
    public static String[] read(String fileName) throws FileNotFoundException{
       return a(fileName);
    }
    
    public static String[] a(String fileName) throws FileNotFoundException{
       return b(fileName);
    }
    
    public static String[] b(String fileName) throws FileNotFoundException{
       return c(fileName);
    }
    
    public static String[] c(String fileName) throws FileNotFoundException{
       throw new RuntimeException();
    }
    }
    

创建异常类

  • 主要是继承RuntimeException,生成不同的构造方法,然后增加或改写属性或方法
public class UserLoginAuthenticationtException extends RuntimeException{

	private String currentOperation;
	


	public UserLoginAuthenticationtException() {
		super();
	}

	public UserLoginAuthenticationtException(String message,String currentOperation) {
		super(message);
		this.setCurrentOperation(currentOperation);
	}
	
	public UserLoginAuthenticationtException(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
		super(arg0, arg1, arg2, arg3);
	}

	public UserLoginAuthenticationtException(String message, Throwable cause) {
		super(message, cause);
	}

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

	public UserLoginAuthenticationtException(Throwable cause) {
		super(cause);
	}

	public void setCurrentOperation(String currentOperation) {
		this.currentOperation = currentOperation;
	}
	
}

相关文章: