Java的Exception
异常的分类
RunTimeException,都是我们平时出现的各种bug,说明这种报错编译的时候是不会报出来的
非RunTimeException,都是我们在写代码的时候就需要捕获的,说明编译都过不去如果不捕获处理的话
非RunTimeException异常的处理方式
try-catch
我们先来看一下如果我们如果不捕捉异常的话会怎么样,发现提示我们throws FileNotFoundException,说明我们不捕捉是不可以的,编译都过不去。 那我们就来捕捉一下
发现捕获了FileNotFoundException,在 fileReader.read(a)还是报错,提示需要捕捉IOException,但是我们知道IOException>FileNotFoundException,那我们就需要只捕捉IOException即可.
package learn;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class MyExceptionOne {
public static void main(String[] args) {
File file=new File("/Users/zc/IdeaProjects/daylywork/testException.txt");
try {
FileReader fileReader = new FileReader(file);
char a[] = new char[50];
fileReader.read(a);
for (char c : a) {
System.out.print(c);
}
fileReader.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
捕获多个异常
我们在代码中再加入Thread.sleep(10000);提示需要同时捕获InterruptedException,因为InterruptedException和IOException没有从属关系,所以需要单独拉出来捕获一次,最后看异常是哪种,做出不同的处理
package learn;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class MyExceptionOne {
public static void main(String[] args) {
File file=new File("/Users/zc/IdeaProjects/daylywork/testException.txt");
try {
FileReader fileReader = new FileReader(file);
char a[] = new char[50];
fileReader.read(a);
for (char c : a) {
System.out.print(c);
}
fileReader.close();
Thread.sleep(10000);
}catch (IOException | InterruptedException e){
if (e instanceof IOException){
System.out.println("IOException");
}
if (e instanceof InterruptedException){
System.out.println("InterruptedException");
}
e.printStackTrace();
}
}
}
比如我传入一个不存在的文件地址
try-catch-finally
无论是否出现异常,finally中的代码都会被执行
throws和throw的区别
throws
throws是作用在方法上的,比如说我们把异常不捕获了,直接抛出去,结果就是我们不处理,但是谁调用了我们的方法,就需要捕获这个异常,或者也抛出去,直到最后一个调用者。
就像下面的One没有捕获异常,抛出去了,那B也没捕获,也抛出去了,Theww就需要捕获才可以。
package learn;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class MyExceptionOne {
public static void One() throws IOException {
File file=new File("/Users/zc/IdeaProjects/daylywork/testException.txt");
FileReader fileReader = new FileReader(file);
char a[] = new char[50];
fileReader.read(a);
for (char c : a) {
System.out.print(c);
}
fileReader.close();
}
public static void Two() throws IOException {
One();
}
public static void Theww(){
try{
Two();
}catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
Theww();
}
}
throw
throw其实就是手动抛出了一个异常,相当于你亲手创建了一个异常而已。
package learn;
import java.io.IOException;
public class MyExceptionOne {
public static void One() {
IOException ioException = new IOException("这是我自己抛出的异常");
try{
throw ioException;
}catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
One();
}
}
结果
java.io.IOException: 这是我自己抛出的异常
at learn.MyExceptionOne.One(MyExceptionOne.java:7)
at learn.MyExceptionOne.main(MyExceptionOne.java:15)
Process finished with exit code 0
自定义异常
首先来自定义一个异常
package learn;
public class MyExceptionOne extends Exception{
public MyExceptionOne(){
super();
}
public MyExceptionOne(String s){
super(s);
}
}
再写一个测试类看看
package learn;
public class MyExceptionTwo {
int a;
public void setA(int a) throws MyExceptionOne{
if (a!=0){
throw new MyExceptionOne("a必须为0");
}
this.a=a;
}
public static void main(String[] args){
MyExceptionTwo myExceptionTwo = new MyExceptionTwo();
try{
myExceptionTwo.setA(1);
}catch (Exception e){
e.printStackTrace();
}
}
}
结果
learn.MyExceptionOne: a必须为0
at learn.MyExceptionTwo.setA(MyExceptionTwo.java:7)
at learn.MyExceptionTwo.main(MyExceptionTwo.java:14)