Java 学习第三天
异常处理
在 Java 中, 异常会导致程序运行时错误, 如果没有得到处理, 程序将会终止
例如
1 | Scanner input = new Scanner(System.in); |
如果为 num2
键入 0, Java 会抛出一个 ArithmeticException
的异常, 程序终止
为解决这个问题, 可以用如下的方式.
1 | import java.util.Scanner; |
当然, 这是不优雅的, 没有扩展性, 我们采取 Java 的异常处理
try-catch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please insert two numbers for num1 and num2: ");
int num1 = input.nextInt();
int num2 = input.nextInt();
try {
System.out.println(num1 + " / " + num2 + " is " + (num1 / num2));
}catch (ArithmeticException ex) {
System.out.println("cannot be divided by zero");
}
}
}try
块是可能发生异常的块,catch
用于捕获参数中的异常, 此处是ArithmeticException
, 一旦捕获到异常, 立马跳转到catch
块创建异常
异常也是一个类, 可以创建对象, 如下创建并抛出异常1
2ArithmeticException ex = new ArithmeticException("Message");
throw ex;申明异常
如果一个方法可能出现异常, 创建时需要声明异常, 以便用户使用时能够知道此方法可能抛出异常, 既进行处理1
2
3public void throwTest() throws Exception{
xxx;
}throws
用于声明异常, 可以声明多个, 以逗号分隔异常类型
- 系统错误, 由 Java 虚拟机抛出, 用
Error
表示LinkageError
- 异常, 用
Exception
表示, 这类可以被程序捕获处理ClassNotFoundException
, 企图使用一个不存在的类IOException
, 文件相关
- 运行时异常, 用
RuntimeException
表示ArithmeticException
, 算术异常, 整数除以 0 导致, 注意浮点数不会NullPointerException
, 企图通过一个 null 引用变量访问一个对象IndexOutOfBoundsException
, 数组下标越界
- 系统错误, 由 Java 虚拟机抛出, 用
finally 子句
用于异常被捕获与否都会执行的块
多线程
- 通过继承
Thread
类构造多线程1
2
3class Threadx extends Thread{
} - 重写
run
方法,方法内部是要让线程做的任务1
2
3
4
5
6
7
8
9
10
public void run() {
while (true) {
if (trick <= 0) {
System.out.println("票已卖完");
break;
}
System.out.println(getName() + "正在售卖第" + (100 - trick + 1) + "张票,还剩下" + (trick--) + "张票");
}
} - 创建并开启线程
1
2Threadx t = new Threadx();
t.start(); - 通过
Runnable
实现1
2
3class T implements Runnable {
} - 重写
run
方法,方法内部是要让线程做的任务1
2
3
4
5
6
7
8
9
10
public void run() {
while (true) {
if (trick <= 0) {
System.out.println("票已卖完");
break;
}
System.out.println(getName() + "正在售卖第" + (100 - trick + 1) + "张票,还剩下" + (trick--) + "张票");
}
} - 创建线程对象
1
2
3
4
5
6
7T win1 = new T();
Thread t1 = new Thread(win1,"窗口一");
Thread t2 = new Thread(win1,"窗口二");
Thread t3 = new Thread(win1,"窗口三");
t1.start();
t2.start();
t3.start();
解决线程不安全
synchronized
锁方法
将run
方法锁起来1
2
3
4
5
6
7
8
9
10
11
12
13while (true) {
synchronized (this) {
if (trick <= 0) {
System.out.println("票已卖完");
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + "正在售卖第" + (100 - trick + 1) + "张票,还剩下" (trick--) + "张票");
}