2020.12.16
2020.12.16
1.方法可变参数
1.1概念
方法可变参数是指方法形参的个数可以变化,个数可以为零,也可以为n个。
1.2定义
例如:
public double area(int...param){
}
1.3规则
(1)一个方法只能有一个可变参数。
(2)如果一个方法有多个参数,那么可变参数必须定义在最后。
(3)方法可变参数本质上是一个数组,因此可变参数可以被当做数组来使用。
1.4调用
方法1:不传入参数
方法2:传入多个离散值
方法3:传入多个数组对象
例如:
public static void area(int...c){
if(c!=null&& c.length>0){
for(int i=0;i<c.length;i++){
System.out.println(c[i]);
}
}
}
public static void main(String[] args){
area();//无参调用,此时area()的参数是空指针
area(1,2,3,4,5);//传入多个离散值,此时area()方法参数c是一个数组,传入的参数是数组元素
int score[] = {67,88,26};
area(score);//传入数组对象,此时area()方法参数c是一个数组
}
2.异常
2.1什么是异常
异常是指程序在运行过程中出现的非正常现象。
2.2异常的体系结构(重点)
2.3 Throwable类
Throwable类是异常体系结构的父类,Throwable类的父类是Object。Throwable又派生出两个子类:Error(错误)和Exception(异常)。
2.3.1 Error类
Error是指无法通过开发人员编写程序能够解决的异常。
典型的Error:内存溢出、动态链接失败(加载dll文件)、虚拟机错误
2.3.2 Exception类
Exception是所有异常类的父类,且又分为运行时异常(父类---RuntimeException类)和编译时异常。
规定:编译时异常必须捕获,如果不捕获会导致程序无法编译,也就无法运行了。例如ClassnotfoundExcetion就是编译时异常,参考代码如下:
解决如下:
2.4 try,catch,finally捕获异常
try,catch,finally异常处理
用法1:
try{
}catch(Exception e){
}
用法2:
try{
}catch(Exception e){
}finally{
}
用法3:
try{
}finally{
}
解析:
(1)try中用于包裹住可能发生异常的代码
(2)catch中用于捕获异常,并对异常进行处理
(3)finally中用于回收资源
(4)try与catch组合时,一个try可以与多个catch组合,但是try只能有一个
(5)try与finally组合时,一个try只能与一个finally组合,且try和finally都只能有一个
(6)try不能单独使用,catch不能单独使用,finally不能单独使用,catch和finally不能组合使用
2.5 throw,throws异常处理
2.5.1 throw
用在方法内部,后面紧跟一个异常对象,表示要抛出这个异常
2.5.2 throws
用于定义在方法声明的后面,表示该方法可能会抛出异常,并告诉主调方法需要处理该方法抛出的异常。Throws不能单独写一行代码,后面是抛出异常的类型,可抛出多个异常类型,多个之间用逗号分隔。
- 用法1:被调方法不处理异常,直接抛给主调方法
public static void main(String[] args){
try{
divide();
}catch(ArithmeticException e){
e.printStackTrace();
}
}
public static void divide() throws ArithmeticException{
System.out.println("start");
int i=1,j=0;
int res=i/j;
System.out.println("over");
}
运行结果:
start
java.lang.ArithmeticException: / by zero
at homework01.Test.divide(Test.java:19)
at homework01.Test.main(Test.java:10)
分析:
(1)main方法是主调方法
(2)divide是被调方法,被调方法内部发生异常时,被调方法没有处理异常,而是将异常抛给主调方法,由主调方法处理异常。
- 用法2:被调方法抓住异常后再次抛给主调方法(常用)
将除0的错误描述显示为中文
代码:
public static void main(String[] args){
try{
divide();
}catch(ArithmeticException e){
e.printStackTrace();
}
}
public static void divide() throws ArithmeticException{
try{
System.out.println("start");
int i=1,j=0;
int res=i/j;
System.out.println("over");
}catch (Exception e){
ArithmeticException ex=ArithmeticException("除零异常");
throw ex;
}
}
运行结果:
start
java.lang.ArithmeticException: 除零异常
at homework01.Test.divide(Test.java:23)
at homework01.Test.main(Test.java:10)
分析:
(1)int res=i/j由于j=0,jvm抛出ArithmeticException异常,该异常被catch抓住,所有catch中的e就是i/j时抛出的异常,但是这个异常由于是jvm创建并抛出的,因此是英文提示。
(2)如何改为中文提示。方法是开发人员自定义一个异常对象,在异常对象的构造函数中输入中文异常描述信息,再将这个异常对象使用throw关键字抛出。
(3)在主调方法中捕获的异常就是中文信息。
2.6自定义异常
当JDK中的异常类型不能满足程序的需要时,可以自定义异常类,使用自定义异常类一般有以下几个步骤。
(1)定义异常类,并继承Exception或者RuntimeException。
(2)编写异常类的构造方法,向父类构造方法传入异常描述信息,并继承父类的其他实现方法。
(3)实例化自定义异常对象,并在程序中使用throw抛出。
例如:
lass Person{
private String name ="";
private int age=0;
private String gender="男";
public void setGender(String gender)throws Exception {
if ("男".equals(gender) || "女".equals(gender)) {
this.gender=gender;
}else {
throw new Exception("性别必须是男或女");
}
}
public void print() {
System.out.println("姓名:"+this.name+",性别"+this.gender+",年龄"+this.age);
}
}
public class Demo7 {
public static void main(String[] args) {
Person person = new Person();
try {
person.setName("顾大嫂");
person.setGender("Female");
person.setAge(18);
person.print();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.7异常相关的方法
getMessage():获取异常描述信息
printStackTrace():输出异常的堆栈信息
评论留言