异常

-----源自《马士兵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关键字后面紧接着它能捕获的异常类型,所有异常类型的子类异常也能被捕获。

因为追求卓越,成功在不经意间追上了你
原文地址:https://www.cnblogs.com/limingxian537423/p/6914805.html