public class Demo01 { public static void main(String[] args) { System.out.println(11/0); }}Exception in thread "main" java.lang.ArithmeticException: / by zero at com.exception.Demo01.main(Demo01.java:5)RuntimeException(运行时异常)
ArrayIndexOutOfBoundException(数组下标越界)
NullPointException(空指针异常)
ClassNotFoundException(找不到类)
这些异常是不检查异常,程序可以选择捕获处理,也可以不处理
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这些异常的发生;
非运行时异常
error通常是灾难性的致命错误,是无法控制和处理的,当出现这些异常时,Java虚拟机一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且程序中应该尽可能的去处理这些异常。
抛出异常
捕获异常
异常处理的五个关键字
?
public class Test { public static void main(String[] args) { int a=1; int b=0;// 假设要捕获多个异常:从小到大 try {//监控区域 System.out.println(a/b); }catch (Error e){//catch(想要捕获的异常类型)捕获异常// System.out.println("程序出现异常,变量b不能为0");//手动 System.out.println("Error"); }catch (Exception e){ System.out.println("exception");//exception }catch (Throwable e) { System.out.println("Throwable"); }finally {//处理善后工作 System.out.println("finally"); }// finally可以不要, } } }public class Test { public static void main(String[] args) { int a=1; int b=0; try { System.out.println(a/b); } catch (Exception e) { e.printStackTrace(); } }// 建设这个方法中处理不了这个异常,方法上抛出异常 public void test(int a,int b) throws ArithmeticException{ if (b==0){ thorw new ArithmeticException();//主动抛出异常,一般在方法中使用 } }}//继承Exception类public class MyExcwption extends Exception {// 传递数字>10; private int detail; public MyExcwption(int a) { this.detail = a; }// toString :异常打印信息 @Override public String toString() { return "MyExcwption{"+detail+'}'; }}public class Test {// 可能会存在异常的方法 static void test(int a)throws MyExcwption{ System.out.println("传递参数为"+a); if (a>10){ throw new MyExcwption(a);//抛出 } System.out.println("OK"); } public static void main(String[] args) { try { test(11); } catch (MyExcwption e) { System.out.println(e); } }}处理运行时异常时,采用逻辑去合理规避同时辅助try catch处理
在多重catch块后面,可以加一个catch (Exception) 来处理可能会被遗漏的异常对于不确定的代码,也可以加上try-catch,处理潜在的异常
尽量去处理异常,切忌只是简单地调用printStackTrace() 去打印输出
具体如何处理异常,要根据不同的业务需求和异常类型去决定
尽量添加finally语句块去释放占用的资源,I0F Scanner~