异常:Exception
关键字
try → 可能有异常的代码
catch → 异常后怎么处理 (参数是要捕获的异常类型.如下图)
finally → 一定会执行的代码
throw → 抛出异常 用于方法
throws → throw 处理不了。向上抛
快捷键: ctrl+alt+t
捕获异常
public class test {public static void main(String[] args) {int a = 1;int b = 0; try { //知道这里有异常System.out.println(a/b); } catch (Exception e) { //参数是要捕获的异常类型//System.exit(1); //程序结束e.printStackTrace(); //打印错误信息} } }
主动抛出异常
public class test {public static void main(String[] args) {new test().abc(1,0); }public void abc(int a,int b){if (b==0){throw new ArithmeticException();//主动抛出异常,一般在方法中使用}} }
方法中处理不了,往上抛。 ----- 接住的人要捕获异常
public class test {public static void main(String[] args) { try {new test().abc(1,0);} catch (Exception e) {e.printStackTrace();} }//假设这个方法中,处理不了这个异常。方法就向上抛出异常public void abc(int a,int b) throws ArithmeticException{if (b==0){throw new ArithmeticException();//主动抛出异常,一般在方法中使用}} }
自定义异常
public class MyException extends Exception { //传递数字private int detail; public MyException(int a ){this.detail = a;} //tostring;异常的打印信息 @Overridepublic String toString() {return "MyException{" +"你传入的数字是=" + detail +'}';} }
public class test {public static void main(String[] args) throws MyException{int a = 111;if (a > 10){throw new MyException(a);//抛出}System.out.println("ok"); } }
输出 Exception in thread "main" MyException{你传入的数字是=111}at test.main(test.java:5) Process finished with exit code 1
异常单词
1、Error Error 类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。 比如说: Java虚拟机运行错误( Virtual MachineError ),当JVM不再有继续执行操作所需的内存资源时, 将出现 OutOfMemoryError 。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止; 还有发生在虚拟机试图执行应用时,如类定义错误( NoClassDefFoundError )、链接错误 ( LinkageError )。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大 多数是程序运行时不允许出现的状况。 对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状 况。在Java中,错误通常是使用Error 的子类描述。
2、Exception 在Exception 分支中有一个重要的子类RuntimeException (运行时异常),该类型的异常自动 为你所编写的程序定义ArrayIndexOutOfBoundsException (数组下标越界)、 NullPointerException (空指针异常)、
ArithmeticException (算术异常)、
MissingResourceException (丢失资源)、 ClassNotFoundException (找不到类)等异常,
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;而 RuntimeException 之外的异常我们统称为非运行时异常,类型上属于Exception 类及其子类, 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException 、SQLException 等以及用户自定义的Exception 异常,一般情况下不自定义检 查异常。
注意: Error 和Exception 的区别: Error 通常是灾难性的致命的错误,是程序无法控制和 处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程; Exception 通常情况下是可 以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
3、检查异常和不受检查异常 检查异常:在正确的程序运行过程中,很容易出现的、情理可容的异常状况,在一定程度上这种异常的 发生是可以预测的,并且一旦发生该种异常,就必须采取某种方式进行处理。 解析:除了RuntimeException及其子类以外,其他的Exception类及其子类都属于检查异常,当程序 中可能出现这类异常,要么使用try-catch语句进行捕获,要么用throws子句抛出,否则编译无法通 过。 不受检查异常:包括RuntimeException及其子类和Error。 分析: 不受检查异常为编译器不要求强制处理的异常, 检查异常则是编译器要求必须处置的异 常。
集合
I/O流
多线程
多任务:一个人同时做多事情
多线程:多条路
Thread 继承
Runnable 实现
创建线程的方法一:继承Thread类
继承Thread类,重写run()方法,调用start开启线程 (线程开启不一定立刻执行,由CPU调度执行)
public class test extends Thread {public void run(){//run方法线程体for (int i =0; i < 20;i++){System.out.println("分线程-----" + i);}}public static void main(String[] args) {//main线程,主线程 //创建一个线程对象test test1 = new test(); //调用start()方法开启线程test1.start();for (int i = 0; i< 200;i++){System.out.println("猪猪猪线程" + i );} } }
实现多线程方式二:实现Runnable接口
Runnable没用Start方法,需要用Thread带入
public class MyRunnable implements Runnable {public void run(){for(int i =0;i <100;i++){//获取线程名字System.out.println(Thread.currentThread().getName()+":"+i);}} }
public class MyRunnableDemo {public static void main(String[] args) {//创建了一个参数的对象//Runnable没用Start方法,需要用Thread带入MyRunnable mr = new MyRunnable();//创建一个线程的对象,并把参数传递给线程。Thread t1 = new Thread(mr);//开启线程t1.start();MyRunnable mr2 = new MyRunnable();Thread t2 = new Thread(mr2);t2.start();} }
实现多线程方式三: 实现Callable接口
import java.util.concurrent.Callable;public class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {for (int i = 0; i < 100; i++) {System.out.println("跟女孩表白" + i);}return "答应你";} }
import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;public class Demo {public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable mc = new MyCallable();//可以获取线程执行完毕后的结果,也可以作为参数传递给Thread对象FutureTask<String> ft = new FutureTask<>(mc);Thread t1 = new Thread(ft);t1.start();//线程结束后的返回值,要在线程后执行String s = ft.get();System.out.println(s);} }
线程取名
public class MyThread extends Thread {public void run(){for (int i = 0; i < 100; i++) {System.out.println(getName() + ":" + i);}} }
public class Demo01GetThreadName {public static void main(String[] args) {MyThread my1 = new MyThread();MyThread my2 = new MyThread();my1.setName("高铁");my2.setName("飞机");my1.start();my2.start();} }
暂停
public class Demo01GetThreadName {public static void main(String[] args) {for (int i = 0; i < 60; i++) {System.out.println(i + "秒");try {Thread.sleep(1000); //暂停1秒} catch (InterruptedException e) {e.printStackTrace();}}} }