今天来聊一下Java的异常处理机制,因为我也是初学者,并没有理解的那么深刻,所以有什么错误的话,还请多多指教。我将用五部分来解释我所理解的Java异常。
一、异常是怎么出现的public class Test {
public static void main(String[] args) {
//写一个会报错的语句
String str = null;
System.out.println(str.length());
}
}
首先我们可以看到控制台出现的:Exception in thread “main”,它是告诉我们异常信息的来源,是发生在main线程中。
然后,后面发现一个拥有描述能力的异常信息,java.lang.xxxxx一个类,这个类是干嘛用的呢?是负责给你打印null指针异常出现的时候,红色的异常信息。
写错的每一个出现异常信息的代码,都会有一个类来进行描述,而且异常信息描述类全部以Exception结尾。
Exception:它是所有异常的根类(root)
异常信息描述类:NumberFormatException,NullPointerException等等。
public class Test {
public static void main(String[] args) {
try {
//写一个会报错的语句
String str = null;
System.out.println(str.length());
} catch (NullPointerException e) {
System.out.println("空指针异常");
e.printStackTrace();//打印红色异常的方法
}
}
}
若try语句里面还有其他的错误的话,可以用多个catch来捕获,例如:
public class Test {
public static void main(String[] args) {
try {
// 会报NullPointerException错误
String str = null;
System.out.println(str.length());
// 会报NumberFormatException错误
String str1 = "aaa";
int res = 1 + Integer.parseInt(str1);
System.out.println(res);
} catch (NullPointerException e) {
System.out.println("空指针异常");
e.printStackTrace();
} catch (NumberFormatException e) {
System.out.println("类型转换异常");
e.printStackTrace();
}
}
}
若你不知道会报什么错误,也可以使用Exception这个父类来捕获异常。
try {
// 会报NullPointerException错误
String str = null;
System.out.println(str.length());
// 会报NumberFormatException错误
String str1 = "aaa";
int res = 1 + Integer.parseInt(str1);
System.out.println(res);
} catch (Exception e) {
System.out.println("所有异常");
e.printStackTrace();
}
而finally是不管有没有异常都会执行的语句,如:
try {
// 会报NullPointerException错误
String str = null;
System.out.println(str.length());
// 会报NumberFormatException错误
String str1 = "aaa";
int res = 1 + Integer.parseInt(str1);
System.out.println(res);
} catch (Exception e) {
System.out.println("所有异常");
e.printStackTrace();
} finally {
System.out.println("最后执行的语句");
}
四、用什么来抛出异常
throws
首先建立一个Utils类
public class Utils {
// throws Exception 方法中所有的异常抛出给调用者进行处理
public void method() throws Exception{
// 会报NumberFormatException错误
String str1 = "aaa";
int res = 1 + Integer.parseInt(str1);
System.out.println(res);
}
}
在Test类里面来调用
public class Test {
public static void main(String[] args) {
Utils u = new Utils();
u.method();
}
}
这里就需要你trycatch一下了, 如果你不想再次trycatch的话,也可以throws给调用它的类,但是这个是main方法,没有什么可以调用main方法,所以只能trycatch一下啦。
这里的throws可以打一个比方,这样更好利于理解。
就像一个人,他生病了,去看医生, 把自己抛给了医生,此时呢,医生就有两个方案,一个就是自己的能力够用,自己能给病人看病,这就相当于用trycatch,另一个方案,就是自己的能力不够,需要一个更有能力的大神,把病人抛给大神,这就相当于再次throws。
public class Test {
public static void main(String[] args) {
throw new RuntimeException("随时随地抛出异常");
}
}
至此就结束了,谢谢观看,如有什么错误的话,还请多多指教。