java抽象接口和异常

数组复制的常用方法有4种

for循环,效率最低

System.arraycopy() 效率最高

Arrays.copyOf() 效率次于第二种方法

Object.clone() 效率次于第二种和第三种

概念

抽象类是所加粗样式有子类的公共属性的集合

抽象类是对多个类的抽象结果
抽象类进一步描述了多个具体类的共同行为特征和行为
抽象类必须被继承才能使用
关键字abstract
Modifies abstract class ClassName;
{}

抽象类的修饰符必须是public 或者protected
用private修饰就不能被子类继承

抽象方法

abstract void method();

任何子类必须重写父类的抽象方法,或者声明自身为抽象类

继承抽象类
abstract class A{
public void method(){
System.out.println(“非抽象方法”);
}
public abstract void abstract_method();
}
class B extends A{
public void abstract_method(){
System.out.println("新方法“);
}
}
public class TestDemo{
public static void main(String []args)

A a = new B();
a.abstract_metfh454g4h87g8f78ijqanpanshohouxiweabwojieudeshiy9ignnigoaljfdlbghod();

}
psvm回车直接生成main函数
sout回车直接生成print框架

继承的抽象函数要进行重写

接口

接口的所有默认属性是public static final
接口的所有方法默认为public abstract

接口的实现
关键字implements可以有多继承

接口的主要功能是对行为的继承

异常处理

异常产生的原因:
1.非法数据
2.文件不存在
3.网络通信时连接中断,JVM内存溢出

异常的类型

检查性异常
打开不存在的文件的时候(不可预见)
运行时异常 (可预见)
会在编译时被忽略
错误
脱离控制的问题
在代码中通常被忽略
常见的有栈溢出

异常的分类
异常处理的根接口时throwable
两个子接口
error和exception
error:运行时环境发生的错误,系统错误类程序员无法处理
exception:程序运行中的异常
exception 
runtime异常
程序运行时产生的异常,jvm会自动处理。典型的运行时异常有:数组下标越界异常
(IndexOutOfBoundsException)、空指针异常(NullPointerException)、对象类型强制转换异常
(ClassCastException)以及数组存储异常(ArrayStoreException,即数组存储类型不一致)等。

**非Runtime异常:**也叫检查异常,即编译器要求必须进行处理的异常,例如IOException、
SqlException。

异常处理机制:

try
catch

finally总会被执行的那个:主要用于回收在try块里打开的物力资源
有数据库连接,网络连接,磁盘文件
先执行finally再执行try或者catch中的return或者throw语句

另外,在以下3种特殊情况下finally块不会被执行

1.在 finally 代码块中产生了异常。
2.在前面的代码中使用System.exit()退出程序。
3.程序所在的线程死亡。

throws 关键字和 throw 关键字的区别如下∶

throws 用在方法声明后面,表示抛出异常,由方法的调用者处理,而throw用在方法体内,用来制造一个异常,由方法体内的语句处理。
throws是声明这个方法会抛出这种类型的异常,以便使它的调用者知道要捕捉这个异常,而 throw是直接抛出一个异常实例。
throws表示出现异常的一种可能性,并不一定会产生这些异常,但如果使用throw就一定会产生某种异常。

throw抛出异常
throws再方法声明中,声明可能抛出的异常
主方法上也可以用throws抛出,表示在主方法里可以不用强制性进行异常处理,出现了异常默认交给jvm处理,此时出现异常后面的程序都无法执行

printStackTrace()方法输出异常信息,信息更详细
getMessage()方法获取有关异常事件的信息。
toString()方法:获取异常的类型与性质。

自定义异常

所有异常都是throwable的子类
检查性异常继承Exception
运行时异常继承RuntimeException

在方法里抛出new 自定义的异常
在方法声明里throws可能出现的自定义异常

练习4
新买了一台电脑,这台电脑与其他的电脑不一样,无法正常启动开机(电脑品牌未声明)。使用继承来体现这个事件,并尝试利用"电脑品牌"引出空指针异常。

package Datawhale.totamo;
class computerException extends Exception{
computerException(String message){
super(message);
}
}
class Computer{
private String brand;
public Computer(){}
public void powerup()throws computerException{
if(brand == null)throw new computerException(“空指针异常”);
else{
System.out.println(brand+“开机”);
} }
}
public class testComputer extends Computer{

public static void main(String[] args) {
    testComputer t1 = new testComputer();
    try{
        t1.powerup();
    }catch(Exception e){
        e.printStackTrace();
    }
}

}

异常的使用原则:

异常处理的主要作用是捕捉并处理程序在运行时产生的异常。编写代码处理某个方法可能出现的异常时,可遵循以下原则∶

不要过度使用异常。虽然通过异常可以增强程序的健壮性,但使用过多不必要的异常处理,可能会影响程序的执行效率;
不要使用过于庞大的try-catch块。在一try块中放置大量的代码,这种写法看上去"很简单",但是由于try块中的代码过于庞大,业务过于复杂,会增加try块中出现异常的几率,从而增加分析产生异常原因的难度;
避免使用catch(Exception e), 如果所有异常都采用相同的处理方式,那么将导致无法对不同异常进行分类处理;
不要忽略捕捉到的异常,遇到异常一定要及时处理;
如果父类抛出多个异常,则覆盖方法必须抛出相同的异常或其异常的子类,不能抛出新异常。
练习5
模拟老师上课前的点名过程,并将旷课的学生作为异常抛出∶张三、李四、王五(老师在点名册上记下了“王五旷课”)。

package Datawhale.totamo;
class validException extends Exception{
public validException(String message){
super(message);
}
}
public class RollCall {
public static void Cutclass(String s[],String s1)throws validException{
for(int i=0;i<s.length;i++){
if(s[i]==s1){
throw new validException(“这个学生旷课”+s[i]);
}
}
}

   public static void main(String[] args) {
    String s[]={"张三","李四","王五"};
    String valid = "王五";
    try{
        Cutclass(s,valid);
    }catch (Exception e){
        e.printStackTrace();
    }
}

}

练习6
超市经常会对定价较市场价低的产品实施限购∶ 超市里的鲜鸡蛋每500 克 3.98 元,每人限购1500克。现将超过1500克的作为异常抛出,而对于满足条件的,计算出应付款
package abdl;

import java.util.Scanner;

class purchaseException extends Exception{
public purchaseException(String message){
super(message);
}
}
public class limitpurchase {
public static void buy(int g)throws purchaseException{
if(g>1500){
throw new purchaseException(“买的太多了,请您买少于1500g”);
}else {
System.out.println(“应付款:”+(float)(3.98*g)+“欢迎下次光临”);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(“请告诉我你要买多少”);
try{
int g = sc.nextInt();
buy(g);
}catch(purchaseException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
sc.close();
System.out.println(“控制输入对象收尾完成”);
}

}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值