异常
什么是异常
异常:程序在运行过程中产生的不正常的情况。
三种类型异常:
- 检查型异常;
- 运行时异常;
- 错误。
检查性异常
例如我们要打开一个文件时,这段代码就可能存在异常,因为这个文件很有可能并不存在。
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 *********/