异常、回顾常用类
异常
异常:程序执行过程中的不正常情况
异常的作用:增强程序的健壮性
异常存在的形式
- 异常在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,程序将被终止。
-
异常处理五个关键字
-
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) { } 可以或多个异常
异常对象的常用方法
- 获取异常简单的描述信息:
- String msg = exception.getMessage();
- 打印异常追踪的堆栈信息
- exception.printStackTrace();
finally关键字
-
在finally字句中的代码是最后执行的,并且是一定会执行的,即使try出现异常,finally也会执行。
finally字句必须和try一起出现
-
通常在finally语句块中完成资源的释放/关闭
-
退出JVM后,finally语句中的代码就不执行了
final finally finalize区别
final 关键字
final修饰的类无法继承
final修饰的方法无法覆盖
final修饰的变量不能重新赋值
finally 关键字
和try一起联合使用。
finally语句块中的代码是必须执行的
finalize 标识符
是一个Object类中的方法名
这个方法是由垃圾回收期GC负责调用的
自定义异常
两步:
- 第一步:编写一个类继承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
- 什么是装箱?什么是拆箱?
- 包装类存在有什么用?
浙公网安备 33010602011771号