Java回顾 异常

异常

什么是异常

异常:程序在运行过程中产生的不正常的情况。

三种类型异常:

  1. 检查型异常;
  2. 运行时异常;
  3. 错误。

检查性异常

例如我们要打开一个文件时,这段代码就可能存在异常,因为这个文件很有可能并不存在。

File f = new File("G://test.java");  
FileInputStream fs = new FileInputStream(f);  

这里G盘下的test.java文件就可能不存在,这个时候运行这段代码就可能会出异常,所以在我们编写代码的时候IDE会提示我们要处理这段代码可能出现的异常。

如果我们不处理的话,程序是不能被编译的。

运行时异常

运行时异常程序员可以不去处理,当异常出现时,虚拟机会处理。常见的运行时异常有空指针异常。

常见的运行时异常:

 ClassCastException(类转换异常)  IndexOutOfBoundsException(数组越界)  NullPointerException(空指针)
 ArrayStoreException(数据存储异常,操作数组时类型不一致)  

错误

错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

Exception类

所有的异常类都是从 java.lang.Exception 类继承的子类。

Exception 类是 Throwable 类的子类。除了Exception类之外,Throwable还有一个子类Error

Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。

Error 用来指示运行时环境发生的错误。

例如,JVM内存溢出。一般地,程序不会从错误中恢复。

异常类有两个主要的子类:IOException 类和 RuntimeException 类。

捕获异常

有一部分异常是需要程序员提前处理的,这种异常统一称为检测性异常,如果我们不处理,程序是不能编译通过的,在IDE中也会出现一条红线。

Java中提供了一个捕获异常的机制:try-catch

try{
	代码A;
	代码B;
}catch(Exception e){
	异常处理
}
public class Task {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num1 = sc.nextInt();
		int num2 = sc.nextInt();
		/********* Begin *********/
		
		try{
		System.out.println(num1/num2);
		}catch(Exception e){
			System.out.println("除数不能为0");
		}
		
		/********* End *********/
	}

}

抛出异常

throw关键字

throw关键字的作用是:主动抛出异常

首先我们来看系统自动抛出异常:

public static void main(String[] args) { 
int a = 10;    
int b = 0;    
System.out.println(a/b);    
}  

运行这段代码系统会自动抛出,java.lang.ArithmeticException异常。

这段程序使用throw关键字也可以实现:

public static void main(String[] args) { 
    int a = 10;   
    int b = 0;   
    if(b == 0){     
        throw new ArithmeticException("/ by zero");      }   
    System.out.println(a/b); 
}  

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

自定义异常

使用自定义异常

我们一般使用继承Exception类的方式来自定义异常,那具体怎么进行呢?

很简单,我们只需要继承Exception,再将信息传递给父类就可以了:

class 自定义异常名 extends Exception{
    //因为Exception已经实现了很多异常处理的方法了属性了,  
    //所以自定义异常只需要将信息传递给父类(使用super关键字)即可  
}  

练习:

package step4;

import java.util.Scanner;

public class Task {
	/********* Begin *********/
	public static void main(String[] args) throws MyException{
		Scanner sc = new Scanner(System.in);
		String username = sc.next();

		//判断用户名
		if(username.length()<3){
			throw new MyException("用户名小于三位Exception");
		}else{
			System.out.println("用户名格式正确");
		}
		
		
	}
}

class MyException extends Exception{
	public MyException(){

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

/********* End *********/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值