JAVA中的异常机制


 Java异常处理的五个关键字:try、catch、finally、throw、throws 

在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?

1.创建一个异常对象。封装一些提示信息(信息可以自己编写)。

2.需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw 就可以完成。throw 异常对象。 throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

使用格式:throw new 异常类名(参数);

throw new NullPointerException("要访问的arr数组不存在");   
throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");
public class ThrowDemo {     
    public static void main(String[] args) {         
        //创建一个数组                  
        int[] arr = {2,4,52,2};         
        //根据索引找对应的元素          
        int index = 4;         
        int element = getElement(arr, index); 
          
        System.out.println(element);         
        System.out.println("over");     
    }     
    /*
     * 根据 索引找到数组中对应的元素
     */     
    public static int getElement(int[] arr,int index){          
        //判断  索引是否越界          
        if(index<0 || index>arr.length‐1){              
            /*
            判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。
            这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。
            */              
            throw new ArrayIndexOutOfBoundsException("哥们,角标越界了~~~");         
        }         
        int element = arr[index];         
        return element;     
    } 
}

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }

public class ThrowsDemo2 {    
    public static void main(String[] args) throws IOException {         
        read("a.txt");     
    }       
    public static void read(String path) throws FileNotFoundException, IOException {
            if (!path.equals("a.txt")) {//如果不是 a.txt这个文件              
            // 我假设  如果不是 a.txt 认为 该文件不存在 是一个错误也就是异常throw
            throw new FileNotFoundException("文件不存在");         
        }         
        if (!path.equals("b.txt")) {             
            throw new IOException();         
        }     
    } 
}

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行 不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
 


自定义异常

要求:我们模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。
首先定义一个登陆异常类RegisterException:
 

// 业务逻辑异常 
public class RegisterException extends Exception {     
    /**      
      * 空参构造      
      */     
    public RegisterException() {     }       

    /**           
      * @param message 表示异常提示      
      */     
    public RegisterException(String message) {         
        super(message);     
    } 
}

模拟登陆操作,使用数组模拟数据库中存储的数据,并提供当前注册账号是否存在方法用于判断。
 

public class Demo {     
    // 模拟数据库中已存在账号     
    private static String[] names = {"bill","hill","jill"};
   
    public static void main(String[] args) {                  
        //调用方法         
        try{               
            // 可能出现异常的代码             
            checkUsername("nill");             
            System.out.println("注册成功");//如果没有异常就是注册成功
        }catch(RegisterException e){             
            //处理异常             
            e.printStackTrace();         
        }     
    }       

    //判断当前注册账号是否存在     
    //因为是编译期异常,又想调用者去处理 所以声明该异常  
    public static boolean checkUsername(String uname) throws LoginException{
        for (String name : names) {             
            if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常 
                throw new RegisterException("亲"+name+"已经被注册了!");             
            }         
        }         
        return true;     
    } 
}

多线程

并发:指两个或多个事件在同一个时间段内发生

并行:指两个或多个事件在同一时刻发生(同时发生)。

进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多 个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。

线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程 中是可以有多个线程的,这个应用程序也可以称之为多线程程序。 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程
 

Java中通过继承Thread类来创建并启动多线程的步骤如下:

1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把 run()方法称为线程执行体。

2. 创建Thread子类的实例,即创建了线程对象

3. 调用线程对象的start()方法来启动该线程

测试类:

public class Demo01 {
    public static void main(String[] args) {
        //创建自定义线程对象          
        MyThread mt = new MyThread("新的线程!");
        //开启新线程
        mt.start();
        //在主方法中执行for循环
        for (int i = 0; i < 10; i++) {
            System.out.println("main线程!"+i);
        }
    }
}  

自定义线程类:
 

public class MyThread extends Thread {
    //定义指定线程名称的构造方法      
    public MyThread(String name) {
        //调用父类的String参数的构造方法,指定线程的名称
        super(name);
    }
      
    /**       
      *重写run方法,完成该线程执行的逻辑       
      */      
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(getName()+":正在执行!"+i);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值