-----源自《马士兵java基础》
今天看代码时,对java的异常throw和catch等很模糊,特意找了之前下载的马士兵基础视频来复习下。
ctrl+t----查找继承树
ctrl+o----查找方法
alt+/-----快速单词
ctrl+shift+/----多行注释
ctrl+1-----创建对象时 new 对象;(代码补充)
java运行过程中产生的异常:
- java异常是java提供的用于处理程序错误的一种机制
- 所谓的错误是指程序在运行过程中发生的一些异常事件
- 设计良好的程序应该在异常发生时提供处理这些错误的方法
- java程序在执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息提交给java运行时的系统,这个过程称为抛出(throw)异常。
- 当java运行时系统接收到异常对象时,会寻找能处理这一异常代码并把当前异常对象交给它处理,这一过程称为捕获(catch)异常
public class TestEx { public static void main(String[] args){ int[] a = {1,2,3}; System.out.println(a[1]); try { System.out.println(2/0); } catch (ArithmeticException ae){ System.out.println("系统出现问题,请及时与管理员进行联系"); ae.printStackTrace(); } } }
异常的分类
error:是系统内部异常,无法处理
exception:可以处理
runtimeexception:可以处理也可以不处理,但运行后会报错。
2.Throwable
Throwable类是所有异常或错误的超类,它有两个子类:Error和Exception,分别表示错误和异常。其中异常Exception分为运行时异常(RuntimeException)和非运行时异常,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
3.Error
一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。
5.运行时异常和非运行时异常
(1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
当出现RuntimeException的时候,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
出现运行时异常后,如果没有捕获处理这个异常(即没有catch),系统会把异常一直往上层抛,一直到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。
finally异常处理
打开文件进行读取,无论是否成功都要进行关闭操作。
import java.io.IOException; import java.io.FileInputStream; import java.io.FileNotFoundException; public class TestEx { public static void main(String[] args) { FileInputStream in = null;//定义文件 try { in = new FileInputStream("myfile.txt"); int b; b = in.read(); while (b != -1) { System.out.print((char) b); b = in.read(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { System.out.println(e.getMessage()); }finally { //finally代码无论产不产生异常都执行 try { in.close(); //关闭文件 } catch (IOException e) { e.printStackTrace(); } } } }
声明方法抛出异常
方法f()和方法f2()都抛出异常给主函数处理,作为程序员,对抛出的异常一定要进行必要的处理。
import java.io.IOException; import java.io.FileInputStream; import java.io.FileNotFoundException; public class TestEx { public static void main(String[] args) { try { new TestEx().f2(); } catch (IOException e) { e.printStackTrace(); } } void f() throws FileNotFoundException,IOException{ FileInputStream in = new FileInputStream("myfile.txt"); int b; b = in.read(); while (b != -1){ System.out.println((char) b); b = in.read(); } } void f2() throws IOException { f(); } }
关键字:throw,throws,try和catch的用法如下:
1、throws出现在方法的声明中,表示该方法可能会抛出的异常,允许throws后面跟着多个异常类型
void f() throws FileNotFoundException,IOException{ FileInputStream in = new FileInputStream("myfile.txt"); int b; b = in.read(); while (b != -1){ System.out.println((char) b); b = in.read(); } }
2、throw出现在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw,不处理就一直往上面抛。
public void regist(User user) { //查询用户名是否存在 String userName = user.getUserName(); int count = userMapper.countUserName(userName); //如果不存在,就抛出异常映射 if(count > 0){ throw new UserNameAlreadyExistException(GlobalMessage.USER_NAME_ALREADY_EXISTS); } //保存 userMapper.insert(user); }
自定义的异常
public class UserNameAlreadyExistException extends RuntimeException{ private static final long serialVersionUID = 1L; //给父类赋值 public UserNameAlreadyExistException(String message) { //调用父类构造方法进行赋值 super(message); // TODO Auto-generated constructor stub } }
可以通过Exception.getMesssage();获取异常信息
3、try出现在方法体中,它自身是一个代码块,表示尝试执行代码块的语句。如果在执行过程中有某条语句抛出异常,那么代码块后面的语句将不被执行。
4、catch出现在try代码块的后面,自身也是一个代码块,用于捕获异常try代码块中可能抛出的异常。catch关键字后面紧接着它能捕获的异常类型,所有异常类型的子类异常也能被捕获。