JAVA异常处理

JAVA异常处理

异常是程序的一种错误,但并不是错误就是异常。
异常Exception
错误Error

我的理解是:
Error是系统的错误,比如栈内存溢出等,Error是编译无法检查出来的,只能通过运行后检查出来。这种是脱离了程序员所能操控的问题范围,所以Error只能停止运行并进行代码修改。
而Exception是程序的错误,这种错误是可以处理的。
总的来说,Exception分为两种
检查型错误(IOException):编译时会被检查出来的异常。例如要打开一个不存在文件,这些异常在编译时不能被简单地忽略。
非检查型异常或称运行时异常(RuntimeException):编译可以通过的异常,所以可以通过程序员的处理来避免的异常。

JAVA的异常处理就是指的是处理RuntimeException型的异常。Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw 语句手动抛出的,只要在Java程序中产生了异常,就会用一个对应类型的异常对象来封装异常,JRE就会试图寻找异常处理程序来处理异常。

异常处理主要分为抛出捕获

抛出

将异常抛给调用者

throwsthrow
throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。

throw语句用在方法体内,是具体向外抛异常的动作,倾向变成真实的。表示抛出异常,由方法体内的语句处理。

Exception分为两种
{ 1,编译时会被检测的异常
2,运行时异常(RuntimeException)
}

关于RuntimeException的一些特例
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Demo
{
int div(int a,int b)throws Exception//此处必须要进行throws的声明
{
if(b==0)
throw new Exception();
return a/b;
}
}


class Demo
{
int div(int a,int b) //此处无throws的声明
{
if(b==0)
throw new ArithmeticException();
return a/b;
}
}

总结:可能在执行方法期间抛出但未被捕获的RuntimeException的任何子类
都无需在throws子句中进行声明。
why?
并不是不能用throws声明,而是并不去声明,因为如果用throws声明,
调用者假如进行捕获处理,继续运行,但如果该异常会影响到后边代码,
那么就会产生很多麻烦,所以不声明的目的其实就是为了停止运行。
So 可以使用,但没必要。

捕获

捕获异常并处理

使用 try 和 catch 关键字可以捕获异常。

1
2
3
4
5
6
7
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}

将可能会出现异常的代码块放在try中,一旦try中捕获到了异常对象,便会执行catch块中的代码,进行异常处理。
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Demo{
int div(int a,int b) {
return a/b;
}
}
public class Test {
int a,b;
public static void main(String[] args) {
Demo d = new Demo();

try {
int num=d.div(3, 0);
System.out.println(num);
}
catch(Exception e) {
System.out.println(e.getMessage());
System.out.println("hhh");
}
System.out.println("over");
}
}

当catch处理以后,程序不会停止,而会继续运行。

综上所述:JAVA中的异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。