# 异常处理
> 用户不正当的输入
> 本身系统的问题
## 为什么要处理异常
如果不处理异常,一旦在出现异常的地方,程序就会被「异常指令流」直接终止,不再往下运行。
## 处理异常
**使用 try catch**
> 判断一个对象是否为空,使用 `null != str`
在程序方法设计,特别是方法的实现中,对于传入的参数,是不可知的,所以要对传入的参数进行最基础的验证后,才能使用,例如,判断是否为 null。
~~~
public static void fun1(String str, String subStr) {
if (null != str && null != subStr) {
if (str.indexOf(subStr) >= 0) {
System.out.println("存在子串");
} else {
System.out.println("不存在子串");
}
} else {
System.out.println("不合法字符串");
}
}
~~~
在 try catch 结构中,catch 是可以省略的,也可以多异常的捕获,但是出现多异常的时候,父类异常只能出现在最下面。
在实际的开发中,一般最简单的方式就是使用一个 Exception 直接处理。
**使用 finally**
无论是否出现异常都会被执行,特别要注意的是,如果没有写 catch ,那么 finally 是会被执行的,但是中断后的语句是不会被执行的。
~~~
public class Demo1 {
public static void main(String[] args) {
String str = "abc";
str = null;
fun1("abc", null);
}
public static int div(int m, int n) {
int k = m / n;
return k;
}
public static void fun1(String str, String subStr) {
try {
System.out.println("11111111");
int i = 10 / 0;
if (str.indexOf(subStr) >= 0) {
System.out.println("存在子串");
} else {
System.out.println("不存在子串");
}
System.out.println("end");
} catch (Exception ex) {
System.out.println("程序出现错误");
ex.printStackTrace();
System.out.println("#"+ex.getMessage());
} finally {
// 一定会被执行的代码块
System.out.println("finally");
}
System.out.println("fun1 end");
}
}
~~~
**throws**
在**方法定义**的后面显式的声明方法是有异常的,调用该方法的程序是要显式的处理异常,后者也可以再次抛出。
~~~
public class Demo2 {
public static void main(String[] args) {
// fun1();
// fun2();
try {
fun3();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void fun1() {
System.out.println("begin");
int i = 0;
try {
i = 10 / 0;
} catch(Exception ex) {
ex.printStackTrace();
}
System.out.println(i);
System.out.println("end");
}
// 使用 throws 抛出异常,通知调用该方法的程序,你要去处理。
public static void fun2() throws Exception{
System.out.println("begin");
int i = 0;
i = 10 / 0;
System.out.println(i);
System.out.println("end");
}
public static void fun3() throws Exception {
System.out.println("begin");
int i = 0;
try {
i = 10 / 0;
} catch (Exception ex){
// 不做处理
throw new Exception("系统错误");
}
System.out.println(i);
System.out.println("end");
}
}
~~~
**throw**
自定义的创建一个异常对象。在一般的异常发生时候,虚拟机会动态的创建一个「系统异常」抛出,和自定义使用 throw 抛出是一个概念。
~~~
public class Demo3 {
public static void main(String[] args) throws Exception {
fun1(17);
System.out.println("end");
}
public static void fun1(int age) throws Exception {
if (age < 18) {
throw new Exception("您的年龄不合法");
} else {
System.out.println("您已经进入VIP房间");
}
}
}
~~~
## 异常堆栈信息
- 异常类
- 异常提示信息:getMessage()
- 异常所在的代码位置:自下而上是异常出现的代码所在方法的调用顺序的先后。
## 常见的异常
NPE:NullPointerException 在调用对象属性或者方法的时候,对象其实是个 null,就会报此异常;
java.lang.ArrayIndexOutOfBoundsException:数组越界
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1:集合越界
- 数据库
- 数据库介绍
- MySQL的安装
- SQL
- 表基本操作
- 修改数据语句
- 数据检索操作
- 多表数据操作
- 练习题
- JAVA
- JAVA 介绍
- JAVA 运行原理
- JDK 配置
- 类和对象
- 数据类型
- 变量
- 直接量
- 运算符
- 流程控制
- 数组结构
- 面向对象
- 隐藏和封装
- 深入构造器
- 类的继承
- 多态
- 包装类
- final 修饰符
- 抽象类
- 接口
- 集合框架
- 常用类学习
- 设计模式-单例模式
- 异常处理
- JDBC
- JSP&Servlet
- Web应用
- Tomcat
- JSP
- Scriptlet
- Page 指令
- 包含指令
- 跳转指令
- 用户注册实例
- JSP练习
- 内置对象
- Servlet
- 过滤器
- Web分层思想
- EL表达式
- JSTL
- 分页实现
- AJAX&JSON
- 开发步骤
- 路径问题
- Log4j
- Mybatis框架
- 框架介绍
- Mybatis简单实现
- 表基本操作
- 优化配置文件
- 表字段名与实体类属性名不同的解决方案
- 一对一关联
- 一对多关联
- Spring框架
- IOC/DI
- 注入对象
- 注解方式 IOC/DI
- AOP
- 注解方式AOP
- 注解方式测试
- Spring MVC框架
- Hello SpringMVC
- 视图定位
- 注解方式
- 接受表单数据
- 客户端跳转
- Session
- 中文问题
- 上传文件
- SSM整合
- 整合步骤
- 分页
- PageHelper
- 连接池
- CRUD
- 事务管理
- JSON
- Maven
- 介绍
- 下载与配置MAVEN
- MAVEN仓库
- ECLIPSE中的MAVEN设置
- ECLIPSE下创建MAVEN风格的JAVA项目
- 添加JAR包
- 创建MAVEN风格的JAVA WEB项目
- 创建SSM项目
- 使用ECLIPSE导入一个MAVEN风格的SSM项目
- 教学管理
- 学员名录
- 周测统计
- 20180608
- 20180706
- 20180721
- 课堂作业
- 练习