异常的概念
异常( Exception 也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中 断正在运行的程序
所需文件找不到
网络连接不通或中断
算术运算错(被零除……)
数组下标越界
装载一个不存在的类或者对null对象操作
类型转换异常
……
当Java程序出现以上的异常时,就会在所处的方法中产生一个异常对象。这个异常对象包括异常的类型,异常出现时程序的运行状态以及对该异常的详细描述。
层次结构
异常分类
异常处理的方式
Error错误
Error表明系统JVM已经处于不可恢复的崩溃状态中。我们不需要管它。
Exception异常
处理方法一、捕获异常
try catch:
使用方法:
try{
//代码段
}catch(异常类型){
//对异常进行处理的代码段
}
如果不使用:
使用了:提示除数不能为0
package cn.xjion.pro07;
import java.util.Scanner;
/**
* 测试try catch的用法
* @author xjion
*
*/
public class TestTrycatch {
public static void main(String[] args) {
// 获取控制台
Scanner sc = new Scanner(System.in);
// 捕获异常
try{
// 用户输入和接收
System.out.println("请输入被除数");
int numA = sc.nextInt();
System.out.println("请输入除数");
int numB = sc.nextInt();
// 计算商
int result = numA/numB;
// 打印
System.out.println(result+"="+numA+"/"+numB);
// 解决异常
}catch (Exception e) {
e.printStackTrace();
}
}
}
try finally
finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。
package cn.xjion.pro07;
import java.util.Scanner;
/**
* 测试try finally
* @author xjion
*
*/
public class TestTryFinally {
public static void main(String[] args) {
// 控制台
Scanner sc = new Scanner(System.in);
// 捕获
try{
// 输入,接收
System.out.println("请输入被除数");
int numA = sc.nextInt();
System.out.println("请输入除数");
int numB = sc.nextInt();
// 商
int result = numA/numB;
// 打印
System.out.println(numA+"/"+numB+"="+result);
// finally语句
}finally{
System.out.println("finally的代码");
}
}
}
try catch finally
正常情况:执行try-finally
异常情况:类型相匹配,执行try-catch-finally
异常情况:类型不相匹配,执行try-finally
如果在 catch 中存在 return 语句,则先执行完 finally 语句 再回头执行 return 语句
这个代码可以先不敲,后面的IO流中有,而且是经典代码
package cn.xjion.pro07;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* 测试一个经典代码,测试try catch finally
* @author xjion
*/
public class TestTrycatchfinally {
public static void main(String[] args) {
// 创建字符输入流
FileReader reader = null;
// 捕获
try {
// 导入文件字符
reader = new FileReader("D:\\a.txt");
char c = (char)reader.read();
char c2 = (char)reader.read();
// 处理
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
// 如果读取的不是空的就关闭流
if(reader != null){
reader.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
异常处理方式二、申明异常throws
当CheckedException产生时,不一定立刻处理它,可以再把异常throws出去。
在方法中使用try-catch-finally是由这个方法来处理异常。但是在一些情况下,当前方法并不需要处理发生的异常,而是向上传递给调用它的方法处理。
如果一个方法中可能产生某种异常,但是并不能确定如何处理这种异常,则应根据异常规范在方法的首部声明该方法可能抛出的异常。
如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。
方法重写中声明异常原则:子类重写父类方法时,如果父类方法有声明异常,那么子类声明的异常范围不能超过父类声明的范围。
package cn.xjion.pro07;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* 测试throws
* @author xjion
*/
public class TestThrows {
public static void main(String[] args) throws IOException {
// 创建字符输入流
FileReader reader = null;
// 导入文件字符
reader = new FileReader("D:\\a.txt");
char c = (char)reader.read();
char c2 = (char)reader.read();
}
}
package cn.xjion.pro07;
public class TestThrows1 {
// show方法抛出异常
public static void show() throws Exception{
}
// method方法抛出异常
public static void method() throws RuntimeException{
}
// main方法
public static void main(String[] args) {//throws Exception
try {
show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
method();
}
}
在继承关系中
父类的方法声明了Exception类型的异常,子类在重写方法时,可以申明也可以不声明。但是如果子类重写方法后的方法使用super关键字调用父类的方法,那么要求必须对异常进行处理。
package cn.xjion.pro07;
public class Father {
// 父类show方法
public void show() throws Exception{
}
}
//子类
class Son extends Father{
// 重写并调用父类方法
@Override
public void show() throws Exception {
super.show();
}
}
如果父类的方法没有异常,那么子类的方法如果一定会有Exception或Checked异常,要求子类必须自己使用try-catch处理,或者给父类方法加上异常的声明
如果子类在重写父类的方法时,产生的异常时RuntimeException异常时,那么可以不用处理。
package cn.xjion.pro07;
public class Father1 {
public void fun() {
}
}
class Son1 extends Father1{
public void fun() throws RuntimeException{
// TODO Auto-generated method stub
super.fun();
}
}
throw抛出异常对象
我们把抛出异常对象的这个过程也称作手写throw抛出异常
public class TestThrow {
public static void show() {
try {
throw new Exception();
}catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
show();
}
}
throws与throw区别
- throws用于声明方法可能会产生的异常类型
throw手动抛出异常对象 - throws写在方法名称后面
throw用于写在方法里
常见的异常类型及解决办法
运行时异常RuntimeException
算术异常ArithmeticException
int b = 0;
if(b != 0) {
int result = 1/b;
}else {
System.out.println("除数不能为0");
}
空指针异常NullPointerException
String str = null;
if(str != null) {
System.out.println(str.length());
}
类型转换异常ClassCastException
//类型转换异常
Animal dog = new Dog();//向上类型转换
if(dog instanceof Cat) {
Cat c = (Cat)dog;//向下类型转换,转换成真实的子类对象
}
数组下标越界ArrayIndexOutOfBoundsException
int[] arr = {11,22,33};
int index = 3;
if(index < arr.length) {
System.out.println(arr[index]);
}else {
System.out.println("数组下标越界了");
}
类型不匹配InputMI是matchException
Scanner input = new Scanner(System.in);
if(input.hasNextInt()) {
int a = input.nextInt();
System.out.println(a);
}else {
System.out.println("输入的类型与期望的类型不匹配");
}
检查时异常
SQLException
IOException
ParseException
必须做处理
throws向上抛
或者try catch finally
public static void main(String[] args) {
//检查时异常,N多个程序在编译期间必须处理的异常的总称
File f = new File("D:\\a.txt");
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
自定义异常
1.在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类。
2.自定义异常类只需从Exception类或者它的子类派生一个子类即可。
3.自定义异常类如果继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。
4.习惯上,自定义异常类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器。
步骤:
1、继承Exception或者RuntimeException
2、定义构造方法
3、使用
设置异常
package cn.xjion.pro07;
public class SexException extends Exception{
//无参构造器
public SexException() {
super();
// TODO Auto-generated constructor stub
}
//带参构造器
public SexException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
使用
package cn.xjion.pro07;
import java.util.Scanner;
public class TestSexException {
public static void main(String[] args) {
// 控制台,输入,接收
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的性别");
String gender = sc.next();
// 判断性别
if("男".equals(gender)||"女".equals(gender)) {
System.out.println("性别录入正确");
}else {
// 不正确时就会弹出只能是男和女
try {
throw new SexException("性别只能是男或者女");
} catch (SexException e) {
// 打印
System.out.println(e.getMessage());
}
}
}
}
好了,异常的知识基本上就这么多了,有不对的地方望大佬们指出^_^!