异常--------------
异常信息的查看
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(“加油”);拼接语法