如果一个方法不能通过正常的路径完成任务的话,它可以通过另一种路径去结束这个方法.
然后抛出一个封装错误信息的对象,同时这个方法立刻退出并且不返回任何值.
另外,调用这个方法的其他代码也不会继续执行,异常处理机制会将代码执行交给异常处理器.
Throwable它是Java语言中所有错误或者异常的超类.
它的下一层为Error和Exception.
为什么这么分呢
主要是在于它们所表示的问题类型以及程序处理问题方式.
Error
问题类型:指Java运行时系统的内部错误和资源耗尽错误.应用程序并不会抛出该类对象.
处理方式:主要是由Java虚拟机负责的,因为它们通常表示严重的问题如果出现该类情况,告知用户,剩下的就是尽力让程序安全的终止.
Exception
问题类型:编译时需要处理的异常
处理方式:需要通过try-catch块或者向上抛出throws来处理的异常.一般编译器会强制去捕获此类异常
举例子
一般包括几个方面:
public class CheckedExceptionExample {
public static void main(String[] args) throws IOException {
// 1. 想在文件尾部读取数据
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
System.out.println("File not found: " + e.getMessage());
}
// 2. 想打开一个错误格式的URL
try {
new URL("some invalid url");
} catch (MalformedURLException e) {
System.out.println("Malformed URL: " + e.getMessage());
}
// 3. 想根据字符串查找Class对象,而这个字符串表示的类不存在
try {
Class.forName("some.invalid.Class");
} catch (ClassNotFoundException e) {
System.out.println("Class not found: " + e.getMessage());
}
}
}
自定义非受检异常:
自定义非检查异常只需要继承 RuntimeException 即可.
举例
public class UncheckedExceptionExample {
public static void main(String[] args) {
// 1. 空指针异常
String str = null;
try {
System.out.println(str.length());
} catch (NullPointerException e) {
System.out.println("NullPointerException caught: " + e.getMessage());
}
// 2. - 例如 StackOverflowError
try {
recursiveMethod(0);
} catch (StackOverflowError e) {
System.out.println("StackOverflowError caught: " + e.getMessage());
}
}
private static void recursiveMethod(int i) {
System.out.println("Recursive method called: " + i);
recursiveMethod(i + 1);
}
}
自定义非受检异常
有两种处理方式:
public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
throw new NumberFormatException();
} else {
System.out.println(s);
}
}
int div(int a,int b) throws Exception{
return a/b;
}
public static void main(String[] args) {
// 1. 空指针异常
String str = null;
try {
System.out.println(str.length());
} catch (NullPointerException e) {
System.out.println("NullPointerException caught: " + e.getMessage());
}
}
我有点好奇,Throw和throws有什么区别呢?
它们主要是位置不同,功能不同
位置不同
throws用在函数上,后面跟的是异常类,可以跟多个;而throw用在函数内,后面跟的是异常对象.
功能不同
它们也有相同的点,它们都是比较消极的处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理.
====先发布,明天继续填坑