在实际工作中遇到的情况不可能是完美的,比如写某个模块时,用户的输入不一定符合编程的要求。你要读取数据库的数据时,数据变成空,等等。这都是异常的表现。
软件程序在运行过程中,同样可以遇到很多异常问题,英文名时Exception。
错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略,英文名为Error。
引入异常处理框架,解决预防异常。 Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。并且java将异常分为两大类:Error和Exception。
package com.xzc.异常;
public class Demo01 {
public static void main(String[] args) {
System.out.println(10/0);//产生ArithmeticException异常
new Demo01().a();//产生StackOverflowError错误
}
public void a(){
a();
}
public void b(){
b();
}
}
既然有了异常,就不能看着异常“肆意妄为”,所有我们要抛出和捕获异常,并且处理异常。处理异常的五个关键字:try、catch、finally、throw、throws。
package com.xzc.异常;
//快捷键 ctrl + alt + t
public class Test {
//try、catch是必须要的、finally可以没有
public static void main(String[] args) {
int a = 1;
int b = 0;
try{//try监控区域
System.out.println(a/b);
}
//捕获异常时要把最大的异常放在最下面
/*
Throwable>Error
Throwable>Exception
*/
//catch这里的用法类似于if else即无论多少个catch只能进入一个catch
catch (ArithmeticException ari){
System.out.println(ari);
}
catch (Error error){
System.out.println("Error");
}
catch (Exception e){
System.out.println("exception" + e);
}
catch (Throwable exception){//捕获异常 如果异常(错误)不对应还是会出现爆红
System.out.println("程序出现异常" + exception);
}//Throwable为最高的异常(如果不知道会是什么异常就Throwable就全能捕获)
finally {//处理善后工作 有没有异常都会执行finally 一般执行一些IO流关闭的语句
System.out.println("finally");
}
}
}
注意:抛出的new异常要和catch中的形参类型一致
package com.xzc.异常;
public class TestThrow {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
if(b==0){//throw语句抛出异常
throw new Exception();//主动的抛出异常
}
System.out.println(a/b);
}
catch (Exception e) {
System.out.println(e);
}
finally {
System.out.println("finally");
}
}
}
package com.xzc.异常;
import java.util.concurrent.TimeoutException;
public class TestThrow {
public static void main(String[] args){
TestThrow testThrow = new TestThrow();
try {
testThrow.test();
} catch (Exception e) {
System.out.println("test出现异常");
} finally {
System.out.println("finally");
}
System.out.println("=============================");
try {
testThrow.xzc();
} catch (Exception e) {
System.out.println("xzc出现异常");
}
}
public void test() throws Exception{
int a = 1;
int b = 0;
if(b==0){
throw new Exception();
}
else{
System.out.println(a/b);
}
}
public void xzc(){
int[] a = {1, 2};
a[2] = 10;
}
}
/*
结果:
test出现异常
finally
=============================
xzc出现异常
*/
用户自定义异常类,只需要继承Exception类即可。
先写出异常程序(根据其他库异常写出):
package com.xzc.异常;
//自定义异常
public class MyException extends Exception{
//传递数>10;
private int a;
public MyException(int a) {
this.a = a;
}
//toString(alt+insert选择toString)
@Override
public String toString() {
return "MyException{" + "a=" + a + '}';
}
}
随后进行异常测试
package com.xzc.异常;
public class TestMy {
public static void main(String[] args) {
try {
test(11);
} catch (MyException e) {
System.out.println(e);//e就是toString方法中的输出
} finally {
System.out.println("finally");
}
System.out.println("=================================");
try {
test(1);
} catch (MyException e) {
System.out.println(e);
}
}
public static void test(int a) throws MyException {
if(a>10){
throw new MyException(a);
}
else{
System.out.println(a);
}
}
}
/*
结果:
MyException{a=11}
finally
=================================
1
*/