异常
异常:程序执行过程中的不正常情况
异常的作用:增强程序的健壮性
异常存在的形式
- 异常在java中以类的形式存在,每一个异常类都可以创建异常对象
int a = 10;
int b = 0;
int c = a / b;
// 实际上JVM在执行到此处的时候,会new异常对象:new ArithmeticException("/ by zero");
//并且JVM将new的异常对象抛出,打印输出信息到控制台了。
System.out.println(c);
异常分类
检查性异常:
? 最具代表的检查性异常使用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略
运行时异常:
? 运行时异常是可能被程序员避免的异常。与检查性异常相反 ,运行时异常可以在编译时被忽略
错误ERROR:
? 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如:当栈溢出时,一个错误就发生了,它们在编译也检查不到
异常体系结构
- Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类
- 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误ERROR和异常Exception
异常处理机制
-
第一种:抛出异常
-
在方法声明的位置上,使用throws关键字,抛给上一级。
-
上抛类似于推卸责任(继续把异常传递给调用者)
-
public class Exception { // 第一种处理方式:在方法声明的位置上继续使用throws来完成异常的继续上抛。抛给调用者 public static void main(String[] args) throws ClassNotFoundException{ doSome(); } public static void doSome() throws ClassNotFoundException{ System.out.println("ClassCastException"); } }
-
-
第二种:捕获异常
-
使用try...catch语句进行异常的捕获。
-
捕捉等于把异常拦下了,异常真正地解决了,(调用者不知道)
-
public class Exception { //第二种处理方式:try...catch进行捕捉 public static void main(String[] args){ try { doSome(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void doSome() throws ClassNotFoundException{ System.out.println("ClassCastException"); } }
-
注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续上抛,抛给了调用者JVM,程序将被终止。
如果希望调用者处理异常就用throws上报,其余情况使用try...catch
-
异常处理五个关键字
-
try、catch、finally、throw、throws
public class Test{ public static void main(String[] args){ int a = 1; int b = 0; //IEDA快捷键:Ctrl + Alt + T try{//try监控区域 System.out.prtinln(a/b); }catch(Exception e){//catch(想要捕获的异常类型!) 捕获异常 表示是否有这个异常,有则执行此处代码块 System.out.println("程序出现异常"); }finally{// 处理善后工作,一定会执行 System.out.println("finally"); } //finally 可以不要finally, 假设IO,资源,关闭 } }
- 抛出异常
public class Exception { public static void main(String[] args) { try { new Exception().test(1,0); } catch (java.lang.Exception e) { e.printStackTrace(); } finally { } } // 假设这方法中,处理不了这个异常。方法上抛异常 public void test(int a , int b) throws ArithmeticException{ if (b==0){//throw throws throw new ArithmeticException();//主动地抛出异常,一般在方法中使用 } } }
-
try....catch
- catch后面的小括号中的类型可以是具体的异常类型,也可以是该异常类型的父类型。
- catch可以写多个。
- catch写多个的时候,从上到下,必须遵循从小到大
- JDK8新特性:catch(FileNotFoundException | ArithmeticException |NullPointerException e) { } 可以或多个异常
自定义异常
两步:
- 第一步:编写一个类继承Exception或者RuntimeException
- 第二步:提供两个构造方法,一个无参的,一个带有String参数的
回顾常用类
- String类
- 对String在内存存储方面的理解:
- 字符串一旦创建不可改变
- 双引号括起来的字符串存储在字符串常量池
- 字符串的比较必须使用equals方法
- String已经重写了toString()和equals()方法
- String的构造方法
- String s = " " ;
- String s = new String(" ");
- String s = new string(byte数组);
- String s = new string(byte数组, 起始下标, 长度);
- String s = new string(char数组);
- String s = new string(char数组, 起始下标, 长度);
- String类常用的21个方法(看文档)
- 对String在内存存储方面的理解:
- StringBuffer/StringBuilder
- StringBuffer/StringBuilder可以看做可变长度字符串
- StringBuffer/StringBuilder初始化容量16
- StringBuffer/StringBuilder是完成字符串拼接操作的,方法名:append
- StringBuffer是线程安全的。StringBuilder是非线程安全的
- 频繁进行字符串凭借不建议使用 "+"
- 那种基本数据类型对应的包装类
- 包装类存在有什么用?
- 方便编程
- 八种包装类的类名是什么?
- Byte
- Short
- Integer
- Long
- Float
- Double
- Boolean
- Character
- 所有数字的父类Number
- 什么是装箱?什么是拆箱?
- 包装类存在有什么用?