文章目录
异常
为什么引入异常
- 举个例子,如果程序员需要拷贝一个文件到硬盘,需要考虑够不够拷贝这就会导致出现问题,所以我们需要提前对可能出现的问题进行考虑和处理,即当程序出现时,程序安全的退出,处理完之后继续执行的机制
逻辑代码和错误处理代码放一起
程序员考虑的事情过多,对程序员本身要求高
java处理异常的过程
- 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给 JRE
- 捕获异常:JRE 得到该异常后,寻找相应的代码来处理该异常。JRE 在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。
- 捕获可以理解为一个方法,传入一个对象(即出现的错误)。
异常的分类
- 运行时异常RuntimeException (unCheckedException)
- 编译的异常CheckedException
NullPointerException 异常&解决
- 原因:当程序访问一个空对象的成员变量或方法,或者访问一个空数组的成员时会发生空指针异常(NullPointerException)。
String str=null;
System.out.println(str.charAt(0));
String str=null;
if(str!=null){
System.out.println(str.charAt(0));
}
ClassCastException 异常&解决
- 原因:在引用数据类型转换时,有可能发生类型转换异常(ClassCastException)。
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{
}
public class Test5 {
public static void main(String[ ] args) {
Animal a=new Dog();
Cat c=(Cat)a;
}
}
public class Test5 {
public static void main(String[ ] args) {
Animal a = new Dog();
if (a instanceof Cat) {
Cat c = (Cat) a;
}
}
}
ArrayIndexOutOfBoundsException 异常&解决
- 原因:当程序访问一个数组的某个元素时,如果这个元素的索引超出了 0~数组长度-1 这个范围,则会出现数组下标越界异(ArrayIndexOutOfBoundsException)。
public class Test6 {
public static void main(String[ ] args) {
int[ ] arr = new int[5];
System.out.println(arr[5]);
}
}
public class Test6 {
public static void main(String[ ] args) {
int[ ] arr = new int[5];
int a = 5;
if (a < arr.length) {
System.out.println(arr[a]);
}
}
}
NumberFormatException 异常&解决
- 原因:在使用包装类将字符串转换成基本数据类型时,如果字符串的格式不正确,则会出现数字格式异常(NumberFormatException)。
public class Test7 {
public static void main(String[ ] args) {
String str = "1234abcf";
System.out.println(Integer.parseInt(str));
}
}
public class Test7 {
public static void main(String[ ] args) {
String str = "1234abcf";
Pattern p = Pattern.compile("^\\d+$");
Matcher m = p.matcher(str);
if (m.matches()) { // 如果 str 匹配代表数字的正则表达式,才会转换
System.out.println(Integer.parseInt(str));
}
}
}
异常处理一 捕获异常
- 捕获异常是通过 3 个关键词来实现的:try-catch-finally。
- 用 try 来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是通过 finally 语句为异常处理提供一个统一的出口,
- finally 所指定的代码都要被执行(catch 语句可有多条;finally 语句最多只能有一条,根据自己的需要可有可无)。
package com.ssc.abnormal;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TryCatch {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileReader reader = null;
try {
reader = new FileReader("a.txt");
char c = (char)reader.read();
char c2 = (char)reader.read();
System.out.println(""+c+c2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
快速创建try catch
右键 suround with trycatch
异常的处理二 抛出异常
- 把异常丢出去,谁调用谁处理
package com.ssc.abnormal;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TryCatch {
public static void main(String[] args) {
// 声明式异常,丢出去
try {
readFile("a.txt");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//把异常丢出去让调用的人处理
public static void readFile(String path) throws Exception{
FileReader reader = null;
try {
reader = new FileReader(path);
char c = (char)reader.read();
char c2 = (char)reader.read();
System.out.println(""+c+c2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
try-with-resource自动关闭 Closable 接口的资源
- 比较简单,是编译器自动帮我们关闭资源
package com.ssc.abnormal;
import java.io.FileReader;
public class TryWithRE {
public static void main(String[] args) {
// TODO Auto-generated method stub
try(FileReader reader = new FileReader("a.txt");){
char c = (char)reader.read();
char c2 = (char)reader.read();
System.out.println(""+c+c2);
}catch(Exception e){
e.printStackTrace();
}
}
}
自定义异常
package com.ssc.abnormal;
class Person {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) throws IllegalAgeException {
if (age < 0) {
throw new IllegalAgeException("人的年龄不应该为负数");
}
this.age = age;
}
public String toString() {
return "name is " + name + " and age is " + age;
}
}
class MyException {
public static void main(String[ ] args) {
Person p = new Person();
try {
p.setName("Lincoln");
p.setAge(-1);
} catch (IllegalAgeException e) {
e.printStackTrace();
}
System.out.println(p);
}
}
class IllegalAgeException extends Exception{
public IllegalAgeException() {
// TODO Auto-generated constructor stub
}
public IllegalAgeException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
Debug自己的程序
- 断点,单步调试