javaSe基础篇
JDK的下载和安装
1.按照提示安装即可
2.配置环境变量
新建JAVA_HOME:
配置系统path路径(也可以设置用户path,但是当系统和用户变量同时存在是,会优先选择系统环境变量)
3.环境变量配置完成,检查是否配置正确,启动命令窗口:
win+R:cmd
-
输入
java
、javac
、java -version
:
DOS命令概述
1.打开DOS窗口:win+R
2.查看当前目录所有文件:dir\
3.切换盘符:cd /d A:
4.清除屏幕:cls
5.查看本机IP:ipconfig
6.相关文件的操作:
-
md 创建文件夹
-
rd 移除文件夹
-
cd>a.txt 新建文件
-
del a.txt 删除文件
基础语法
注释
1.单行注释://
2.多行注释:/* */
3.文档注释:/** */
关键字
关键字是java里有特殊意义的标识符
如for,if,case
数据类型
1.java是强类型语言
所有变量要先定义(变量名,类型,作用域,变量值)
2.java的数据类型分为两大类
1.基本数据类型
简单类型 | boolean | byte | char | short | Int | long | float | double | void |
---|---|---|---|---|---|---|---|---|---|
二进制位数 | 1 | 8 | 16 | 16 | 32 | 64 | 32 | 64 | -- |
封装器类 | Boolean | Byte | Character | Short | Integer | Long | Float | Double | Void |
byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值。
2.引用数据类型(变量,对象)
3、常见的问题
-
银行业务的表示:
不能使用浮点数,会有舍入误差,只能说接近,因为会有精度损失
-
BigDecimal:数学工具类;
变量 常量
public class Test01 { public static void main(String[] args) { //局部变量 int a=100; //常量 final int MAX_A=100; Test01 test01 = new Test01(); System.out.println(test01.id); System.out.println(b); System.out.println(MAX_A); System.out.println(PI); System.out.println(a); } //实例变量 int id; String name; int age; //类变量 static int b; static final double PI=3.14;
public class Demo3 { int a; String b; boolean c; public static void main(String[] args) { Demo3 test = new Demo3(); int a=test.a; System.out.println(a);//实例变量在创建实例时会被类加载器初始化,所以可以输出; System.out.println(test.b); System.out.println(test.c); } }
类型转换
1.java中整数类型默认的int类型;小数类型默认的double;
2.String的字符串转化为char类型时,只能用char类型的数组来接收;字符串在转化成char类型是不能像int、float那样使用封装类的parseXXX方法等,但它可以转换成char类型的数组;long str1=Long.parseLong(str);
3.byte de=(byte) 128;System.out.println(de); 结果:-128 //如果数字溢出当前的数字类型,有两种方法可以阻止其出错,一种是直接强转成 当前数据类型,另一种是转成其他的数据类型(较大的)**
4.String的字符串进行类型转换时,如果字符串中包含long整形的字符大写L或者小写l时,在转换成字符串时,会出现错误
例如: String str="123L"; long str1=Long.parseLong(str); System.out.println(str1);//结果:错误
String的字符串是float、double浮点型时,字符串可以加f、F、D、d等,在进行基本类型转换时不会出错
例如: String f1="12.34f";
float f2=Float.parseFloat(f1); System.out.println(f2);//结果:12.34,;d、D也一样
5.自动类型转换(也叫隐式类型转换) ,其实就是小范围的数据类型向大范围的数据类型转换,例如int类型转long
强制类型转换(也叫显式类型转换) int b = (int)(i + j);
强制类型转换在某种情况下会丢失精度
表达式的数据类型自动提升
public class Demo1 { public static void main(String[] args) { int a =2; int b=3; double c=3.1415D; float d=3.141f; long e=352L; short f=12; char g='a'; int a1=a++; int a2=++a; double h= Math.pow(2,3); System.out.println(g+f); System.out.println(a+b); System.out.println(a+b+c+d+e+f+g);//向上转型,类型自动提升为最大的 System.out.println(a/b); System.out.println(a!=b); System.out.println(a1); System.out.println(a2); System.out.println(h); } }
运算符
算数运算符的种类
+ | - | * | / | % | ++ | -- |
---|---|---|---|---|---|---|
注:整数相除只能得到整数,如果想得到小数,就要使用浮点数(float、double);/是获得除法的商;%获取的是除法操作的余数(4%5=8),运算结果的符号取决于参与运算的左边的符号。
++--运算符的用法
++:自加。对原有的数据进行+1 | --:自减。对原有数据进行-1 |
---|---|
放在操作数的前面和后面效果一样 | |
注:放在操作数的前面,先自增或者自减,然后再参与运算; 放在操作数的后面,先参与运算,再自增或者自减。 |
Math类
double h= Math.pow(2,3);//2^3,因为java没有幂运算,除此之外还可以移位实现
赋值运算符的种类
= | += | -= | *= | /= | %= |
---|---|---|---|---|---|
赋值运算符的注意事项
基本的赋值运算符=:把=右边的数据赋值给左边。 |
---|
扩展的赋值运算符+=,-=,*=,/=,%=:把左边和右边做加法,然后赋值给左边。 |
赋值运算符要求左边的数据必须是一个变量 |
关系运算符的种类
== | != | <= | >= | > | < | instanceof |
---|---|---|---|---|---|---|
关系运算符的注意事项
无论你的操作是简单还是复杂,结果是boolean类型 |
---|
"=="不能写成"=" |
逻辑运算符的种类
!(非) | &(与) | &&(短路与) | |(或) | ||(短路或) | ^(异或) |
---|---|---|---|---|---|
public class Demo2 { public static void main(String[] args) { int c=4; boolean d=(c<3)&&(c++<3); System.out.println(d);//短路 } }
位运算符的种类
~(按位取反) | <<(左移) | &(与) | |(或) | >>(右移) | ^(异或) | >>>(无符号右移) |
---|---|---|---|---|---|---|
~:按位取反 0变1 1变0 | 空位补0,被移除的高位丢弃 | &:有0则0 | ^:相同则0,不同则1 | 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。 | ^:相同则0,不同则1 | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
小知识:
System.out.println(2<<3);//表示2^3
三目运算符与格式
public class Demo2 { public static void main(String[] args) { String f=2<1?"good":"false";//前为真则为good,为假则为false; System.out.println(f); }
扩展运算符
+= -= *+ /= <<=
例:a+=c 等价于a=a+c a<<=x等价于a=a<<x
此处不做过多赘述
包机制:import package;
流程控制
用户交互Scanner
import java.util.Scanner;
Scanner s=new Scanner(System.in);
next() nextLine()获取输入内容
hasNext() hasNextLine()判断是否还有输入
package JavaSe.struct; import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner src=new Scanner(System.in); int[] i=new int[src.nextInt()]; for (int x:i) { System.out.println(x); } src.close(); } }
顺序结构
顺序结构:就是从头到尾依次执行每条语句的操作。
选择结构
在java中,选择结构分为if-else
语句和 switch
语句。
//单选择结构 if(布尔表达式){ 语句或语句块 }else{ 语句或语句块 } //多选择结构 if(布尔表达式){ 语句或语句块 }else if(布尔表达式){ 语句或语句块 }else{ 语句或语句块 }
1)if括号里表达式的值返回的必须是布尔类型
2)如果条件体内只有一条语句
需要执行,那么if后面的大括号可以省略
。建议不要省略!
3)如果出现有多个if一个else
的情况,else子句归属于最内层的if语句
。
switch(表达式){ case 常量值1: 语句块; break; case 常量值2: 语句块; break; case 常量值3: 语句块; break; .. default: 语句块; break; }
1)switch中表达式的返回值只能是int,byte,char,short,枚举,字符串
;
2)case子句中的值必须是常量
,且不能重复
;
3)default可有可无
;
4)break作为某一个case代码段的结束句,使其跳出程序
。
循环结构
while循环 do...while循环 for循环
public class BreakList { public static void main(String[] args) { int i=0; while(i<10) { if (i<5) { System.out.println(i); } i++; System.out.println(i); } } }
public class Demo4 { public static void main(String[] args) { for(int j=1;j<10;j++) { for(int i=1;i<=j;i++){ System.out.print(j+"*"+i+"="+j*i); } System.out.println(); } } }
public void test(){ int i=0; do { if (i<5) { System.out.println(i); } i++; System.out.println(i); } while (i<10);
//for循环深入 //奇数和偶数的和分别是多少-100以内 public void test2(){ int oddSum=0; int evenSum=0; for (int i = 0; i <= 100; i++) { if (i/2!=0){//奇数 evenSum=evenSum+i; }else {//偶数 oddSum=oddSum+i; } } //九九乘法表 public void test3(){ for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ System.out.print(i*j); } System.out.println(""); } } //增强for循环 //遍历数组 public void test4(){ int[] arry=new int[10]; for(int x;arry){ System.out.printl(x); } }
break && continue&&return
break语句:
break语句刚刚在switch中已经见过了,是用来终止case的。实际上,break出现在while,do-while,for循环中,用于强行退出当前循环。
continue语句:
continue只能用于for,while,do-while循环语句中,用于让程序跳出本次循环,直接进入下次循环。
return语句
public void show(){ System.out.println("show---"); return;//结束方法 }
public static int add(int a, int b){ return a+b;//返回值 }
三角形打印
public class Triangle { public static void main(String[] args) { for (int i = 0; i <=5; i++) { for (int j = 5; j >=i; j--) { System.out.print(" "); } for(int j=0;j<=i;j++) { System.out.print("*"); } for(int j=0 ;j<i;j++) { System.out.print("*"); } System.out.println(); } } }
###
方法
方法的定义和调用
-
[修饰符] 返回值类型 方法名([参数类型 参数名],[…]){return 值}
方法的重载
-
方法名必须相同
-
参数列表必须不同(个数不同、参数类型不同、参数列表的顺序不同)
-
参数的返回值类型可以不同也可以相同
-
仅仅返回值类不同不足以构成方法的重载
public static void main(String[] args) { test(3,5);//调用静态方法 Test03 test03 = new Test03(); System.out.println(test03.test(1,2,3));//调用非静态方法 System.out.println(test03.test(1.0,2.0)); } static void test(int a, int b){ System.out.println(a+b); } int test(int a,int b,int c){ return a+b+c; } double test(double a,double b){ return a+b; } }
可变参数
1.在方法声明中 类型后面加...
2.必须在参数列表的最后
3.储存类似于数组
int test(int... a){ for (int i = 0; i < a.length; i++) { System.out.print(a[i]+"\t"); } return 0; } test03.test(1,2,3,4,5);//方法的调用
递归详解
-
递归就是方法自己调用自己
-
递归分为递归头 和 递归体
public class Demo1 { public static void main(String[] args) { System.out.println(f(3)); } private static int f(int n){ if (n==1){ return 1; }else { return n*f(n-1);//10*9*8*7*6*5*4*3*2*1 } } }
数组
数组创建与声明
dateTyepe[] arrayNmae;或者dateTyepe[] arrayName[]
创建数组:dateType[] arrayName=new dateType[arraySize];或者 dateType[] arrayName={...};
数组一旦被创建,其大小不会改变
获取数组长度
arrays.length
内存分析
堆:存放对象及数组
栈:存放变量类型及引用对象的变量
方法区:calss static变量
二维数组
dateType arratName=new dateType[arraySize] [arraySize];或者 dateType[] arrayName={...};
冒泡排序
public class ArraysDemo2 { public static void main(String[] args) { int[] array={101,5,2,1,6,7,4,9,100,99}; System.out.println(Arrays.toString(sort(array))); } public static int[] sort(int[] array){ int imp=0; for (int i = 0; i <array.length-1; i++) { //每轮外层比较,内层两两比较,都会把最小或最大的冒泡到最后一位 for (int j=0;j<array.length-1-i;j++){ //,因此,每轮外层之后都可以减少一个内层最后一位 if (array[j+1]>array[j]) { imp=array[j]; array[j]=array[j+1]; array[j+1]=imp; } } } return array; } }
稀疏数组
行数 | 列数 | 非0总数 |
---|---|---|
x | y | sum |
非0元素. | 非0元素. | 非0元素. |
public class ArraysDemo3 { ArraysDemo3(){ System.out.println("调试"); } public static void main(String[] args) { //创建原数组 ArraysDemo3 test=new ArraysDemo3(); int[][] array1 = new int[10][10]; array1[2][5] = 25; array1[8][7] = 26; array1[9][9] = 88; //遍历输出原数组 for (int[] ints : array1) { for (int anInt : ints) { System.out.print(anInt + "\t"); } System.out.println(""); } System.out.println("=========="); //获取非0数组元素个数 int sum = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (array1[i][j] != 0) { sum++; } } } //根据非0元素个数觉得稀疏数组size; int[][] array2 = new int[sum+1][3]; //稀疏数组头部 array2[0][0] = 10; array2[0][1] = 10; array2[0][2]=sum; int sum2 = 1; //将原数组非0元素赋值稀疏数组 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (array1[i][j] != 0) { array2[sum2][0] = i; array2[sum2][1] = j; array2[sum2][2] = array1[i][j]; sum2++; } } } for (int[] anInt2:array2) { for (int anInt3:anInt2) { System.out.print(anInt3+"\t"); } System.out.println(""); } System.out.println("======"); //方向逆转稀疏数组 System.out.println("还原"); int[][] array3=new int[array2[0][0]][array2[0][1]]; for (int i = 1; i <array2.length; i++) { for (int j = 0; j <array2[i].length; j++) { array3[array2[i][0]][array2[i][1]]=array2[i][2]; } } for (int[] ints : array3) { for (int anInt : ints) { System.out.print(anInt + "\t"); } System.out.println(""); } }
面向对象
一切皆对象
类构造器
-
方法名和类名相同;
-
无参构造器是默认存在的;
-
如果自己定义了一个有参构造器,那么无参构造器必须显示定义
public class Student { String name; int age; //alt+insert自动生成 //无参构造器 public Student() { } //有参构造器 public Student(String name, int age) { this.name = name; this.age = age; } void study(){ System.out.println(this.name+"\t"+this.age+"\t"+"在学习!"); } } public class Application { public static void main(String[] args) { Student student1 = new Student("lscong",22); student1.study(); } }
封装
-
程序追求“高内聚、低耦合”,
-
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
-
低耦合:尽量暴露少量的方法给外部使用;
-
私有属性----定义set、get方法
一句话,属性私有(get/set方法)!
继承
-
关键字:extends;
-
java中只有单继承,没有多继承;
-
子类拥有父类所有的东西,但是私有的东西是不能被继承的;
-
Object是所有类的父类,直接继承Object
-
super关键字:调用父类的属性及方法
-
重写:
需要有继承关系,子类重写父类 方法名必须相同,方法体不同 参数列表必须相同 修饰符可以扩大:public>protected>default>private 抛出的异常:可以缩小,但是不能扩大 子类重写了父类,那么对象调用的就是执行重写的方法 为什么重写:
父类的功能,子类不一定需要,或者不一定能够满足
-
1.父类是有参构造,子类必须调用父类的有参构造 2.子类加载构造器时,默认先加载父类构造器,以此类推到从父类的父类开始 3.调用父类或者自身构造器时,必须放在构造器方法的第一行 4.构造器可以有多个过载构造器(不同形参)
public class Teacher extends Person{ Teacher(){ super("name");//如果父类是有参构造,子类必须显示调用有参构造,因为子类默认构造无参构造 }
public class Person { Person(){ System.out.println("this is the father"); } private String name; private String sex; private int age; public String str="这是父类常量"; public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public String getSex() { return sex; } public int getAge() { return age; } public void test(){ System.out.println("这是父类方法"); } public static void test3(){ System.out.println("这是父类静态方法"); } } class Teacher extends Person{ Teacher(){ } public String str="这是子类常量"; public void test(){ System.out.println("这是子类方法"); } public void test2(){ System.out.println("这是子类多余方法"); } public static void test3(){ System.out.println("这是子类静态方法"); } public static void main(String[] args) { Object teach=new Teacher(); teach.test(); teach.test3(); System.out.println(teach.str); System.out.println(teach instanceof Person); } }
多态
(Father f1=new Son();)
1.一个对象的实际类型是确定的,但指向它的引用可以不同
2.因为指向它的引用类型不同,而表现出不同的方法(因为编译时类型表现为父类,而运行时类型是子类)
3.多态的存在条件 有继承关系 子类重写父类的方法 父类的引用类型指向对象
4.只有方法多态,而无属性多态
6.总是执行子类的重写方法,而无法执行子类的独有方法
5.instanceof用于判断两个对象之间是否存在父子关系
public static void main(String[] args) { Person teach=new Teacher(); teach.test();//表现为子类重写方法 teach.test3();//表现为子类重写方法 //teach.test2(); //无法执行子类自有方法 System.out.println(teach.str); System.out.println(teach instanceof Person);//ture } }
Student s1=new Student(); Person s2=new Student(); Object s3=new Student(); //Object>Person>Student //Object>Person>Teacher //Object>String s3 instanceof Student//true s3 instanceof Person//true s3 instanceof Object//true s3 instanceof String//false s3 instanceof Teacher//false s1 instanceof Student//true s1 instanceof Person//true s1 instanceof Object//true s1 instanceof String//编译错误 s1 instanceof Teacher//编译错误 s2 instanceof Student//true s2 instanceof Person//true s2 instanceof Object//true s2 instanceof String//编译错误 s2 instanceof Teacher//false
static关键字
static修饰的方法或者是变量 常量 内部类都会变成类的成员变量,作为类的一部分
抽象类
-
abstract关键字修饰
-
是一种约束,抽象方法,只有方法没有具体的方法体实现
-
只能靠子类去实现方法
-
抽象类中可以存在非抽象类方法,但是非抽象类不能写抽象方法
-
子类继承抽象类,必须对其抽象方法进行重写
public abstract class Abstract { Abstract(){ System.out.println("抽象类里有构造器"); } public abstract void doSomething();//抽象方法不能有方法体 public void okk(){ System.out.println("抽象类可以有普通方法");//抽象类可以有普通方法 } //抽象方法必须在抽象类中 //抽象类不能实例化 //抽象类有构造器 //抽象方法必须被子类实现 //抽象类可以没有抽象方法 } class Action extends Abstract{ public void doSomething(){ System.out.println("子类必须实现抽象方法"); } public static void main(String[] args) { Action action=new Action(); action.doSomething();; action.okk(); } }
接口
接口只有规范
1.implements:继承关键字
2.interface:修饰符
3.[public abstract] void run();//方法
4.接口中定义的变量均为常量:[public abstract final ] AGE=100;//接口里不允许有变量
5.接口可以实现多继承
6.只有规范,自己无法写方法
7.以后均在面向接口编程
8.子类继承接口,子类必须对其方法进行重写
public interface TimeType { int a=1; public static final int b=2;//接口里面的常量默认全部用public static final修饰 void add(); public abstract void delete();//接口里的方法全部默认用public abstract }
内部类
成员内部类
public class Outer{ private String name; private int age; public void outer(){ System.out.println("outer!"); } public class Inner{ public void inner(){ System.out.println("inner!"); } } } //new Outer outer=new Outer();//非静态内部类依赖于外部类实例而实例化 Outer.Inner inner=outer.new Inner();//非静态内部类创建实例语法 outerclassDemo.new.innerclass() inner.inner();
静态内部类
public class StaticInner { private String name; private int age; public void outer(){ System.out.println("outer!"); } public static class Inner{ public void inner(){ System.out.println("inner!"); } } public static void main(String[] args) { Inner test2=new Inner();//静态内部类不需要依赖外部类实例实例化 } } class Normal{ public static void main(String[] args) { StaticInner.Inner test3=new StaticInner.Inner();//静态内部类创建语法 new outerclass.innerclass() }
package JavaSe.oop; public class Outer { static String name="外部类静态变量"; String name2="外部类实例变量"; String box="这是外部类重名变量"; public static void test1(){ System.out.println("这是外部静态方法"); } public void test2(){ System.out.println("这是外部实例方法"); } public class Inner{ Inner(){ System.out.println("这是内部类的构造器"); } static String innerName="这是内部类静态变量"; String getInnerName2="这是内部类实例变量"; String box="这是内部类重名变量"; public static void innerTest(){ test1(); //test2(); //实例内部类静态方法无法访问实例外部类实例方法,即 静态无法访问实例 System.out.println(name); } public void innerTest2() throws Exception{ String box="这是方法局部变量"; test1(); test2(); System.out.println(name2); System.out.println(box); System.out.println(this.box); System.out.println(Outer.this.box); } } public static void main(String[] args) { Outer outter=new Outer(); Outer.Inner inner=outter.new Inner(); //内部类只能通过外部实例化类来实例化 Outer.Inner.innerTest(); //Outer.Inner.innerTest2(); //外部类实例化对象无法直接访问内部类实例方法; try { inner.innerTest2(); }catch (Exception e){ System.out.println(e); } inner.innerTest(); } }
非静态内部类依赖于外部类实例而实例化
静态内部类不需要依赖外部类实例实例化\
非静态内部类创建实例语法 outerclassDemo.new.innerclass()
静态内部类创建语法 new outerclass.innerclass()
实例内部类静态方法无法访问实例外部类实例方法,即 静态无法访问实例
局部内部类
public class Outer{ private String name; private int age; public void outer(){ public class Inner{ private int score; void run(){ System.out.println("run!"); } } System.out.println("outer!"); } }
匿名内部类
package JavaSe.oop; public interface TimeType { int a=1; public static final int b=2;//接口里面的常量默认全部用public static final修饰 void add(); public abstract void delete();//接口里的方法全部默认用public abstract } class Test{ public static void main(String[] args) { new TimeType(){ //在main方法里的匿名内部类 @Override public void delete() { } @Override public void add() { } }; } }
异常处理
程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。 (1)编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。 (2)运行时错误是因为程序在执行时,运行环境发现了不能执行的操作。 (3)逻辑错误是因为程序没有按照预期的逻辑顺序执行。异常也就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制。
Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。异常和错误的区别是:异常能被程序本身可以处理,错误是无法处理。
Thrwoable常用方法
1. 返回异常发生时的详细信息 public string getMessage(); 2. 返回异常发生时的简要描述 public string toString(); 3. 返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同 public string getLocalizedMessage(); 4. 在控制台上打印Throwable对象封装的异常信息 public void printStackTrace();
异常抛出:任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。从方法中抛出的任何异常都必须使用throws子句。 异常捕获:捕捉异常通过try-catch语句或者try-catch-finally语句实现。 总体来说,Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的RuntimeException和Error。
public class Outer { public void innerTest2() throws Exception{ } } public static void main(String[] args) { Outer outter=new Outer(); try { outter.innerTest2(); }catch (Exception e){ System.out.println(e);//此处调用了异常类的toString() } finnally{ ... } } }
public class Except { int a=0; int b=2; public void test(){ try{ if (a==0){ throw new ArithmeticException();//主动抛出异常 } System.out.println(a/b); }catch (ArithmeticException e){ System.out.println(e); }finally { System.out.println("这是一个默认处理语句,在catch不到异常时才执行"); } } }
创建自己的异常类
public class Excep extends Exception { String myException; public Excep(String myException){ this.myException="这是我自己定义的异常类"; } public String toString(){ return myException; } } class ThrowsEX { public void test() throws Excep{ System.out.println("测试自己的异常类"); } public static void main(String[] args) { try { new ThrowsEX().test(); }catch (Excep e){ System.out.println(e); } } }