JAVA异常和JAVA多线程

异常--------------

异常信息的查看

​ 1:看控制台出现的 异常红色信息

​ 2:根据信息得知是哪里的代码出问题了

​ 带java的地方 就是异常类型 / by zero 对异常信息的描述 后面就是出问题的代码和 代码的位置

​ 3:得到一个结论

​ 1:什么异常ArithmethicException

​ 2:异常信息 /by zero

​ 3:哪一行代码出问题了

异常类型的继承体系

​ java.lang.Throwable -> java.lang.Error && java.lang.Exception

​ 1.Error 表示代码运行时的异常 如系统崩溃内存溢出 可以不处理

​ StackOverflowError:当应用程序递归太深而发生堆栈溢出时,抛出该 错误。比如死循环或者没有出 口的递归调用

​ OutOfMemoryError:因为内存溢出或没有可用的内存提供给垃圾回收 器时,Java 虚拟机无法分配一 个对象,这时抛出该错误。比如 new 了非 常庞大数量的对象而没释放。

​ 2.Exception 表示编译时期的异常

异常的处理

自己处理/捕获异常

try{
    //可能出现的异常代码
}catch(要捕获的异常类型 变量){
    //处理获取到的异常代码
}

//代码练习
public class CatchDemo{
    public static void mian(String[] args){
        
    }
    
    public static void divide(int a, int b){
        try{
            System.out.println(a/b);
        }catch(ArithmeticException e){
            System.out.println("除法运算有错误");
            //打印错误的位置
            e.printStackTrace();
        }
    }
}

//

自己处理多个异常

try{
    //可能出现的异常代码1:
    //可能出现的异常代码2:
    //可能出现的异常代码3:
    //可能出现的异常代码4:
}catch(异常变量类型A 变量){
    //处理A异常的代码
}catch(异常变量类型B 变量){
    //处理异常类型代码
}

finall

方法声明 与try连用 可以没有catch 如果需要做释放资源类似的操作 ,建议写到这个代码中

访问异常信息

​ String getMessage(); 返回异常类型

​ void printStackTrace(); 打印异常类型名和异常信息,以及程序中出现异常的位置

public class void divide(int a , int b){
    try{
        System.out.println("a/b");
    }catch(ArithmeticException e){
        e.pritStackTrace(); //打印异常类型的异常信息
        System.out.println("异常信息:"+ e.getMessage());
    }
}

异常的抛出

Throws 将可能会异常的代码抛出给调用者处理

​ 方法的声明,目的就是告知调用者处理这个异常

​ throws 异常类

Throw 将异常的代码 在方法内使用提示出来

​ 在执行业务处理中需要返回一个异常给调用者

​ throw 异常对象

public class ThrowsDemo{
    public static void main(String[] args){
        try{
            divide(1,0);
        }catch(ArithmeticException e){
            e.printStackTrace();
        }
    }
    
    public void divide(int a ,int b) throws Exception{
        System.out.println(a/b);
        throw new ArithmeticException("对不起,0不能作为除数");
    }
}

运行异常

​ Runtime异常 就是在编译的时候不会被检测出来的异常

​ 在编译时期不被检测出来的异常可以不适用try catch finally 和throws 处理

编译异常

​ 在编译的时候就被检测出来的异常

​ 需要使用throws 和 try catch finall 来运行

自定义异常类

​ 什么时候需要i自定义异常类 当出现未知错误或者当自带的异常类不够用的时候 自定义异常类

​ 自定义异常类的两种方式 1:继承 exception 或者 RuntimeException类

​ 继承之后需要提供一个无参数构造方法和一个带String类型的参数的构造器

定义一个类 表示一个客户类,表示一个用户

public class Customer{
    String name;
    int age;
    public Custome(String name , int age){
        this.name = name;
        if(age<150&& age >0){
            this.age = age;
        }
    }
    //定义一个客户异常,专门抛出给用户看的异常类型
    public class AgeException(String message){
        super(message);//勿忘,表示把传递的异常信息存储到异常对象中
    }
}

//测试类
 public class ExceptionDemo{
     public static void main(String[] args){
         try{
             Customer c = new Cunstomer("刘彦",400);
         }catch(AgeException e){
             e.printStackTrace();
         }
     }
 }

常用异常类

​ NullpointerException:空指针异常.最多的异常

public class NullDemo{
    String s =  null;
    System.out.println(s);
    
    //空指针异常
}

线程--------------

为什么要使用线程

​ 1.耗时的操作使用线程,提高应用程序的相应速度

​ 2.并行操作时使用线程,如c/s 架构的服务器并发线程响应请求

​ 3.多cpu系统中使用线程提高cpu利用率

​ 4.改善程序结构,一个既长又复杂的进程可以考虑分为多个线程,称为几个独立或者半独立的运行部分,程序会例如理解和修改

线程如何使用

​ 1:创建线程的两种方法 继承和实现

//继承方法实现线程的创建
	//1.必须覆盖run方法 线程启动直接启动run方法
    //2.线程的启动start方法
	//3.获取当前线程的名字super.getName()
public class Apple entends Thread{
    int apple = 50;
    public void run(){
        System.out.println(super.getName()+"吃了编号为"+apple+"的苹果");
    }
}
public class AppleDemo{
    //创建对象
    Apple a = new Apple();
    //启动线程
    a.start();
    
    //或者
    new Apple(/*这个里面可以直接写名字只要在线程加个构造器就可以了*/"").start();
}


//实现方法
	//1.覆盖run方法
	//2.获取当前线程对象 Thread.currentThread().getName();
	//3.创建当前线程的对象 new Thread(Runnable, "名字").start();
public class Apples implments Runnable{
    int apple = 50;
    public void run(){
        System.out.println(Thread.currentThread().getName()+"吃了"+apple+"号的苹果");
    }
}

public class ApplesDemo{
    public static void main(String[] args){
        new Thread(Apples,"小明").start();
    }
}

多线程存在的问题

​ 1.纯在多线程并发访问的问题

​ 2.每个线程不设限制会每次都取一个目标对象

​ 3.根源就是多线程并发访问同一个资源

多线程问题的解决方案

​ 同步代码块和同步方法 synchronized

​ 建议尽量缩小同步代码块的作用范围

//同代码块
//1.哪里需要同步哪里 没有同步方法安全
//1.任何时候都只有一个线程拿到同步代码块,谁拿到同步锁就执行,其他的等着
public class Apple implments Runnable{
    int apple = 50;
    public void run(){
       thread(this/*表示当前的目标源,也可以为Apple*/){ 		System.out.println(Thread.currentThread().getName()+"吃了编号"+apple+"的苹果");
        apple--;
    }
    }
}

//同步方法 
//保证一个线程在执行此方法的时候 其他线程在方法外面等着
synchronized public class apples implements Runnable{
    int apple = 50;
    public void run(){
        System.out.println(Thread.currentThread().getName()+"吃了为"+apple+"号的苹果");
        apple--;
    }
}

线程的开发

继承方式

​ 1.继承Thread的类

​ 2.覆盖run方法

​ 3.start方法启动,创建对象启动 获取名用super.getName();

实现方法

​ 1.实现Runnable

​ 2.实现run方法

​ 3.使用statr方法启动 new Thread(Runnable ,",名字").start();

两者的区别

​ 继承方法比较简单,但是不能实现多线程数据共享,只能继承一个类

​ 实现方法相对于继承较难,但是可以实现多线程数据共享,可以实现多个方 法

后台线程

​ 在启动之前设置,如果在启动之后设置会有异常 IllegalThreadStateException

线程中的方法

jion方法和sleep放啊

同步

异步

//jion用于同步线程,它可以使线程之间的并行执行变为串行执行 , 
//例如a在线程中调用b线程 那么只有当b线程执行结束后才会继续执行a
	对象.join();
//sleep方法会让正在执行的线程暂停一段时间,进入阻塞状态,常用来模拟网络延迟等
sleep(long milllis) throws InterrupedException ;;单位为毫秒

synchronized 的优劣

​ StringBilder 方法没有使用synchronized方法所以效率比较高

​ StirngBuffer 使用了synchronized 方法所以安全性比较高

StingBuilder sb = new StringBuilder();

sb.append(“中国”),append(“加油”);拼接语法

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页