ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java学习笔记012

2021-06-10 21:31:21  阅读:159  来源: 互联网

标签:java String int System 笔记 012 println 异常 out


一.匿名内部类

没有名字的一个内部类

作用: 没有类本身作用,只为了重写一些抽象方法,方便调用这个方法 ,匿名内部类可以简化这种实现类。简化符合需求的实现类,子类->接口|抽象父类

public class Inner {
    public static void main(String[] args) {
        Demo d = new Demo();
        d.smoking();
       //2)引用接收: 接口多态
        Smoke s = new Smoke(){  //匿名内部类的类体
            @Override
            public void smoking() {
                System.out.println("边吸烟边跳舞...");
            }
        };
        s.smoking();//边吸烟边跳舞...
        //1)匿名对象-> 无引用接收匿名内部类对象地址:  匿内部类对象的后面直接调用
        //创建一个Smoke接口的一个没名字的实现类(匿名内部类)的对象
        new Smoke(){  //匿名内部类的类体
            @Override
            public void smoking() {
                System.out.println("边吸烟边玩手机...");
            }
        }.smoking();//边吸烟边玩手机...
        //3)作为方法的实参
        test(new CH());
        test(new Demo());
        test(new Smoke() {
            @Override
            public void smoking() {
                System.out.println("边吸烟边笑...");
            }
        });
    }
​
    static void test(Smoke smoke){
        smoke.smoking();
    }
​
}
​
//吸烟接口
interface Smoke{
    void smoking();
}
//实现类 ,本身具类本身的含义
class CH implements Smoke{
    public String name;
    int age;
    @Override
    public void smoking() {
        System.out.println("边吸烟边敲代码");
    }
}
//实现类 : 本身没有自己的含义与作用,为了重写抽象方法smoking,便于调用
class Demo implements Smoke{
    @Override
    public void smoking() {
        System.out.println("边吸烟边吐烟圈...");
    }
}

二.lambda表达式

作用:该功能就是为了简化内部类结构,前提是内部类实现的是函数式接口。只存在一个必须被重写的抽象方法的接口就是函数式接口,可以利用 @FunctionalInterface 检查一个结口是否为函数式接口。

定义结构: ( )-> { }

( ) : 重写的抽象方法的参数列表。

-> : lambda 符号,也称为箭头符号,具有上下文推导的作用。

{ } :重写抽象方法的方法体。

public class Lambda {
    public static void main(String[] args) {
        Test01_Lambda.test();
    }
    static void test(){
        //lambda标准写法省略方法名
        Lmabda1 lmabda1 = ()->{ System.out.println("方法一"); };
        lmabda1.lambda1();
        //当lambda体中的语句体只有一句,前后的{}可以省略
        lmabda1 = () -> System.out.println("方法二");
        lmabda1.lambda1();
        //参数列表的数据类型可以省略
        Lmabda2 lmabda2 = (i) -> System.out.println("方法三"+i);
        lmabda2.lambda2(8);
        //如果参数只有一个,前后的()可以省略 ,如果参数个数为2~多个,前后()不能省略
        lmabda2 = i -> System.out.println("方法四单参数"+i);
        lmabda2.lambda2(9);
        Lmabda3 lmabda3 = (a,b) -> System.out.println("方法四多参数"+(a+b));
        lmabda3.lmabda3(6,6);
        //如果方法存在返回值,并且{}中语句体只有一句,为return 带出返回值语句,前后的{}与return关键字可以一起省略
        lmabda4 = (c,d) -> c+d;//方法五       
        System.out.println(lmabda4.lmabda4(11,22));//方法五的返回值
    }
}
interface Lmabda1{
    void lambda1();
}
interface Lmabda2{
    void lambda2(int i);
}
interface Lmabda3{
    void lmabda3(int i,int j);
}
interface Lmabda4{
    int lmabda4(int m,int n);
}

 

三.异常 Exception

1.意义

意义:异常就是程序出现了问题,程序一旦遇到异常,后面代码无法正常执行,这时控制台中展示异常的详细信息|细节问题,便于程序猿的调试。主要分为 Error 与 Exception 。

Error :一般指由虚拟机生成并脱出的异常,无需程序员解决处理。

Exception : 异常,如果不处理,程序无法正常执行,需要程序员在代码层面上处理异常。分为 RuntimeException (运行时异常):运行期间才会发生的异常;CheckedException (编译时异常|检查时异常):编译期间发生的异常,不处理程序无法运行。

重点注意:

1)所有的异常都可以通过标准异常处理方案来处理。 2)运行时异常一般通过增强程序健壮性的代码就可以解决 -> if判断。 3)编译时异常只能通过异常处理方案来处理。

常见运行异常:

NullPointerException 空指针异常
    s = null;System.out.println(s.length());
ArithmeticException 数学异常
    System.out.println(5/0); 
ArrayIndexOutOfBoundsException 数组索引越界异常
    int[] arr = {1,2,3};System.out.println(arr[5]); 
NegativeArraySizeException 数组长度负数异常
    int[] arr = new  int[-3];
ClassCastException 类型转换异常
    Object obj = "张三";
    System.out.println((自定义类)obj);
NumberFormatException 转换格式异常
    String str = "123abc";
    System.out.println(Integer.valueOf(str));

2.异常的处理

异常抛出:throws :把异常抛出到上一层,谁调用谁处理。

异常捕获:异常对象当场抓住捕获,直接处理。

try { 
    可能出现异常的代码//出现异常代码后直接执行catch,异常代码后的所有代码不再执行。
}  catch ( 异常类型  e ){ 
    e.printStackTrace ( ); 
}  catch (Exception e){
    e.printStackTrace ( );//所有异常都可捕捉(接盘侠)接收区间最大,一般放在后面,捕获区间越大越放在后面。可放n个catch
}......finally { //无论怎样都会被执行,一般放在最后
    执行代码
}   

注意:

1.异常一旦处理,不影响程序的继续执行 2.try中代码可能出现异常,可能不会出现异常,如果没有出现异常,try{}中的代码执行完毕,try...catch结束。 try中代码一旦异常,try后面的代码不会执行,直接执行catch的判断,从上到下一次判断,判断当前的catch是否能够捕获出现的异常对象,如果能,执行后面的{}中的代码,如果不能匹配,继续向下判断,如果所有的都不能匹配,当前的异常对象没有处理,中止程序的执行。 3.一个try后面可以跟1~n个catch。 4.如果一个异常已经通过catch处理不影响后面代码的执行。 5.接收范围较大的异常的catch,需要定义在后面。 6.finally 最终的,无论try中是否会出现异常,finally中的代码肯定最后会执行一般会定义一些资源的关闭等代码。

public class Class002_Exception {
    public static void main(String[] args){
        //编译时期异常
        //InputStream is = new FileInputStream("");
        try {
            System.out.println("try开始了....");
            test();//出现异常直接执行catch,下面代码不再执行。
            System.out.println(5/0);
            System.out.println("try结束了....");
        } catch (FileNotFoundException e) {
            System.out.println("出现了文件未找到异常, 捕获异常...");
            e.printStackTrace();
        } catch (Exception e) {//一般定义在最后用来确定异常可以被捕获。
            System.out.println("接盘侠");
            e.printStackTrace();
        } finally {
            System.out.println("最后肯定会执行的代码");
        }
        System.out.println("main方法结束了....");
    }
    static void test() throws FileNotFoundException,NullPointerException {
        InputStream is = new FileInputStream("D://aaa.txt");//抛出异常
    }
}

3.自定义异常

异常类也是类:需要直接或者间接的继承自Exception,如果是运行时期异常必须直接或者间接的继承 RuntimeException。通过 throw 制造异常:。

public class Test01_AgeException {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        User user = new User();
        System.out.print("请输入姓名:");
        user.setName(scanner.nextLine());
        try {
            System.out.print("请输入年龄:");
            user.setAge(scanner.nextInt());
        } catch (AgeException e) {
            e.printStackTrace();
        }
        if(user.getAge()>18&&user.getAge()<80){
            System.out.println("创建成功"+user);
        }else {
            System.out.println("创建失败,年龄不合法");
        }
    }
}
//创建异常类
class AgeException extends Exception{
    public AgeException(){
        //空构造器
    }
    public AgeException(String massage){
        super(massage);
    }
}
​
//用户类
class User{
    private String name;
    private int age;
​
    public User() {
        //空构造器
    }
​
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) throws AgeException {
        if(age<18||age>65){
            throw new AgeException(age+"年龄不合法");
        }
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

四. String 字符串类

1.意义

本身是一个不可变长字符序列,String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。常见的如"abc" 是一个字符串常量存在于字符串常量池中(方法区),也可以创建:new String() 存在于方法堆中。

存储方式:

1)在 jdk11 中使用字节数组存储字符串数据 private final byte[] value;

2)在 jdk8 中使用字符数组存储字符串数据 private final char[] value;

2.String类中的常用方法

public class String_Method{
    public static void main(String[] args){
        String str1 = "abcdefghijklmn";
        String str2 = "Abcdefghijklmn";
        //char charAt(int index) 返回指定索引处的 char值。
        System.out.println(str.charAt(4));//e
        //int codePointAt(int index) 返回指定索引处的字符(Unicode代码点)。
        System.out.println(str1.codePointAt(4));//101
        //int compareTo(String anotherString) 按字典顺序比较两个字符串。
        System.out.println(str1.compareTo(str2));//32
        //int compareToIgnoreCase(String str) 按字典顺序比较两个字符串,忽略大小写差异。
        System.out.println(str1.compareToIgnoreCase(str2));//0
        //String concat(String str) 将指定的字符串连接到此字符串的末尾。
        System.out.println(str1.concat(str2));//abcdefghijklmnabcdefghijklmnAbcdefghijklmnAbcdefghijklmn
        //boolean contains(CharSequence s) 当且仅当此字符串包含指定的char值序列时,才返回true。
        System.out.println(str1.contains("tian"));//false
        //boolean equals(Object anObject) 将此字符串与指定的对象进行比较。
        System.out.println(str1.equals(str2));//false
        //boolean equalsIgnoreCase(String anotherString) 将此 String与另一个 String比较,忽略了大小写。
        System.out.println(str1.equalsIgnoreCase(str2));//true
        //boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结尾。
        System.out.println(str1.endsWith("klmn"));//true
        //static String copyValueOf(char[] data) 相当于 valueOf(char[]) 。把一个字符数组转为字符串
        String str3 = String.copyValueOf(new char[]{'a','b','c'});
        System.out.println(str3);//abc
        //void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将此字符串中的字符复制到目标字符数组中。
        char[] ch = new char[10];
        System.out.println(Arrays.toString(ch));//[ ,  ,  ,  ,  ,  ,  ,  ,  ,  ]
        str1.getChars(3,11,ch,1);
        System.out.println(Arrays.toString(ch));//[ , d, e, f, g, h, i, j, k,  ]
        //int indexOf(String str) 返回指定子字符串第一次出现的字符串中的索引。
        System.out.println(str1.indexOf("efg"));//4
         //int indexOf(String str, int fromIndex) 从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引。
        System.out.println(str1.indexOf("efg",5));//18
        //int lastIndexOf(int ch) 返回指定字符最后一次出现的字符串中的索引。
        System.out.println(str1.lastIndexOf("efg"));//18
        //int lastIndexOf(int ch, int fromIndex) 返回指定字符最后一次出现的字符串中的索引,从指定的索引开始向后搜索。
        System.out.println(str1.lastIndexOf("efg",5));//4
    }
}

 

标签:java,String,int,System,笔记,012,println,异常,out
来源: https://blog.csdn.net/weixin_58665137/article/details/117791619

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有