异常的简介
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。
##异常发生的原因有很多,通常包含以下几大类##
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-
要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
Exception和Error
异常处理,就是当程序出了错误时,系统不崩溃。
顶层类:Throwable
大分类 | 小分类 | |
---|---|---|
Error | 处理不了 | |
Exception | 编译时异常 | 必须处理(不处理编译不通过) |
运行时异常 | 可以处理 |
Error示例:
public class TestError {
// Exception in thread "main" java.lang.StackOverflowError
public static void main(String[] args) {
m();
}
static void m() {
m();
}
}
编译时异常:
static void TestException1() {
try {
throw new FileNotFoundException("编译时异常,必须处理,要么自己处理s,要么抛出");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
static void TestException2() throws FileNotFoundException {
throw new FileNotFoundException("编译时异常,必须处理,要么自己处理,要么抛出");
}
public static void main(String[] args) {
TestException1();
try {
TestException2();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
运行时异常:在运行中遇到的异常
public class 异常处理 {
public static void main(String[] args) {
int a = 10, b = 0;
TestException(a, b);
}
static boolean TestException(int a, int b) {
try {
System.out.println(a / b);
} catch (ArithmeticException e) {// 声明,此处可能抛出"算术异常"
System.out.println("系统维护中,请稍后重试");
return false;
} finally {
System.out.println("---END---");
}
return true;
}
}
throw和throws的区别
throw抛出异常
public static void main(String[] args) {
int a = 10, b = 0;
TestException(a, b);
}
static boolean TestException(int a, int b) {
try {
if(b==0){
throw new Exception("b不能为0");
}else{
System.out.println(a / b);
}
} catch (Exception e) {// java.lang.Exception: b不能为0
System.out.println(e);
} finally {
System.out.println("---END---");
}
return true;
}
throws抛出异常
public static void main(String[] args) {
int a = 10, b = 0;
try {
TestException(a, b);
} catch (Exception e) {
// System.out.println(e);
e.printStackTrace();
}
}
static void TestException(int a, int b) throws Exception {
if (b == 0) {
throw new Exception("b不能为0");
} else {
System.out.println(a / b);
}
}
区别在于throw抛异常可以在调用这个函数时再对于异常进行最终的处理
异常的层层抛出
public class cal {
//除法计算
//b不能为0
public void calc(int a,int b) throws Exception {
if(b==0){
try {
throw new Exception("有异常哦!!!!");
} catch (Exception e) {
System.out.println("有异常哦!!!!");
throw e;
}
}
else{
System.out.println(a/b);
}
}
}
public class 层层抛出异常 {
public static void main(String[] args)throws Exception{
cal ac=new cal();
int i=1;
try {
ac.calc(5,0);
} catch (Exception e) {
System.out.println("输入的除数不能为0!!!!");
}
}
}
现在函数的内部抛出一个公共的异常,只要调用了该函数都会抛出这
个异常,用throws再次向外抛出异常可以在调用这个函数时对异常进行更加明确的处理
自定义异常:
public class Test自定义异常 {
public static void main(String[] args) {
int a = 10;
TestException(a);
}
static boolean TestException(int money) {
try {
if (money < 10000) {
// 拋一个异常对象
throw new DidiException("系统升级,请半年后重试");
}
} catch (Exception e) {// 声明,此处可能抛出"算术异常"
e.printStackTrace();
return false;
} finally {
System.out.println("---END---");
}
return true;
}
}
class DidiException extends Exception {
public DidiException(String message) {
super(message);
}
}
}