# Java学习笔记——异常和异常处理
- Throwable:Error,Exception
- Exception:RuntimeException(非检查异常),检查异常
- RuntimeException:NullPointerException(空指针异常),ArrayIndexOutOfBoundsException(数组下标越界异常),ClassCastException(类型转换异常),ArithmeticException(算数异常)
- 检查异常:IOException(文件异常),SQL异常(SQLException),需要手动添加捕获以及处理语句。
## 处理异常
try-catch
:
try{
//一些会抛出异常的方法
}catch(Exception e){
//处理该异常的代码块
}
如果抛出异常,则终止程序,程序的控制权将被转移交给catch块中的异常处理程序,可以发出警告,也可以进行错误日志记录,下面的例子对错误进行警告处理
try{
System.out.print("请输入您的年龄:");
Scanner input = new Scanner(System.in);
int age = input.nextInt();
System.out.println("十年后您" + (age + 10) + "岁");
}catch(InputMismatchException e){
System.out.println("请输入整数!");
}
System.out.println("谢谢使用!");
输入小数,运行结果
如果抛出很多类型的异常,需要用到多重catch块
try{
//一些会抛出异常的方法
}catch(Exception e){
//处理异常Exception的方法
}catch(Exception2 e){
//处理异常Exception2的方法
}...(n个catch块)...{
}
下面的例子可能出现两种异常,针对每种异常分别处理
try{
Scanner input = new Scanner(System.in);
System.out.print("请输入第一个数:");
int a = input.nextInt();
System.out.print("请输入第二个数:");
int b = input.nextInt();
System.out.println("两数相除结果是:" + a / b);
}catch(InputMismatchException e){
//e.printStackTrace();//打印异常
System.out.println("请输入整数!");
}catch(ArithmeticException e){
System.out.println("除数不能为0!");
}
运行结果
在catch异常时,要按照子类-父类的顺序进行检测,在上面的例子中,InputMismatchException
异常必须在ArithmeticException
异常的前面,否则编译器会报错
try-catch-finaly
用于最终将要执行的代码,进行“善后工作”
try{
//一些会抛出异常的方法
}catch(Exception e){
//处理异常Exception的方法
}catch(Exception2 e){
//处理异常Exception2的方法
}...(n个catch块)...{
}finally{
//最终要执行的一些代码
}
## 异常抛出
throw
——将产生的异常抛出(动作)
throws
——声明将要抛出何种类型的异常(声明)
public void divide(int a, int b) throws Exception{
if(b == 0)//出现异常
throw new Exception("除数不能为0!");//向上级报告
else
System.out.println("相除结果为:" + a /b);
}
## 自定义异常
借助于Java现存的异常类型,例如Exception,自定义异常要继承Exception类或者其子类 public class 异常名 extends Exception
例子:在图书查询系统中,若查询的书不存在,则出现BooknotExistException
异常,定义方法如下
public class BooknotExistException extends Exception{
public BooknotExistException(){
super("图书不存在!");
}
}
//异常检测中输出错误信息
catch(BooknotExistException e){
System.out.println(e.getMessage());
## 图书查询系统文件代码
//自定义异常
public class BooknotExistException extends Exception{
public BooknotExistException(){
super("图书不存在!");
}
}
//自定义异常
public class ErrorCommandException extends Exception{
public ErrorCommandException(){
super("命令输入错误,请根据提示输入命令!");
}
}
import java.util.InputMismatchException;
import java.util.Scanner;
public class SearchBook{
String[] Book={"数据结构","大学物理"};
Scanner input = new Scanner(System.in);
int command;
String name;
int num;
public static void main(String[] args) {
while(true){
SearchBook searchBook = new SearchBook();
searchBook.inputCommand();
if(searchBook.command == 1)
searchBook.inputName();
else if(searchBook.command == 2)
searchBook.inputNumber();
else if(searchBook.command == 0)
break;
}
}
public void inputCommand(){
try{
System.out.println("输入命令:1-按照名称查找图书,2-按照序号查找图书,0-结束查询");
command = input.nextInt();
if(command != 1 && command != 2 && command !=0){
throw new ErrorCommandException();
}
}catch(InputMismatchException e1){
ErrorCommandException ee = new ErrorCommandException();
System.out.println(ee.getMessage());
} catch(ErrorCommandException e){
System.out.println(e.getMessage());
}
}
public void inputName(){
try{
System.out.println("输入图书名称:");
name = input.next();
for(int i = 0; i < Book.length; i++){
if(Book[i].equals(name)){
System.out.println("book:" + Book[i]);
return;
}
}
throw new BooknotExistException();
}catch(BooknotExistException e){
System.out.println(e.getMessage());
}
}
public void inputNumber(){
try{
System.out.println("输入图书序号:");
num = input.nextInt();
if(num > 2 ){
throw new BooknotExistException();
}
System.out.println("book:" + Book[num - 1]);
}catch(InputMismatchException e1){
input.nextLine();
ErrorCommandException ee = new ErrorCommandException();
System.out.println(ee.getMessage());
}catch(BooknotExistException e2){
System.out.println(e2.getMessage());
}
}
}