首页 > 编程语言 >软件设计之Java入门视频(13)

软件设计之Java入门视频(13)

时间:2024-07-08 20:58:13浏览次数:20  
标签:13 Java 软件设计 System println catch 异常 public out

软件设计之Java入门视频(13)

视频教程来自B站尚硅谷:

尚硅谷Java入门视频教程,宋红康java基础视频
相关文件资料(百度网盘)
提取密码:8op3
idea 下载可以关注 软件管家 公众号

学习内容:

该视频共分为1-717部分
本次内容涉及360-389
在写代码时,总是需要来回切换界面来看代码要求,这里推荐Snipaste,可以把截图以窗口形式放在屏幕上
记录内容:

  1. 内部类
  2. 异常

1、内部类

1)Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
2)内部类的分类:成员内部类(静态、非静态)局部内部类(方法内、代码块、构造器内)
3)成员内部类
  作为外部类的成员:
  a)可以调用外部类的结构
  b)可以被static修饰
  c)可以被四种不同权限修饰(public、缺省、protected、private)
  作为类的成员:
  a)可以定义属性、方法、构造器
  b)可以被final、abstract修饰

package test;

public class InnerClassTest {
    public static void main(String[] args) {
        //创建Dog类(静态成员内部类)
        Person.Dog dog = new Person.Dog();
        dog.show();
        //创建Bird类(非静态成员内部类)
        Person person = new Person();
        Person.Bird bird = person.new Bird();
        bird.sing();
    }

}

class Person{
    int age;
    public void eat(){
        System.out.println("吃饭");
    }
    public void method(){
        //局部内部类
        class AA{

        }
    }
    //静态成员内部类
    static  class Dog{
        int age;
        public void show(){
            System.out.println("叫");
        }
    }
    //非静态成员内部类
    class Bird{
        int age;
        public Bird(){

        }
        public void sing(){
            System.out.println("唱歌");
            Person.this.eat(); //调用外部类的非静态属性
        }
        public void display(int age){
            System.out.println(age); //方法形参
            System.out.println(this.age);//内部类属性
            System.out.println(Person.this.age);//外部类属性
        }
    }
}

2、异常

Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowErrorOOM。一般不编写针对性的代码进行处理。
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
空指针访问、试图读取不存在的文件、网络连接中断、数组角标越界
运行时异常:是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免其出现的异常。
编译时异常:是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。编译器要求Java程序必须捕获或声明所有编译时异常

Error举例

public class ErrorTest {
    public static void main(String[] args) {
       // main(args);  栈溢出 StackOverflowError
       Integer[] arr = new Integer [1024*1024*1024] //堆溢出  OOM OutOfMemoryError
       
    }
}

异常处理:抓抛模型

过程1:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出。一旦抛出对象以后,其后的代码就不再执行。
过程2:“抓”:异常的处理方式
1)try-catch-finally
2) throws

try-catch-finally

1)finally是可选的
2)使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象类型,去catch中进行匹配
3)一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常处理,一旦处理完成,跳出当前try-catch结构(在没有写finally的情况)
4)catch中的异常类型如果没有子父类关系,声明在上/下不影响
5)catch中的异常类型满足子父类关系,则要求子类一定要声明在父类之上,否则报错unreachalbe
6)常用的异常对象处理的方式:String getMessage(); printStackTrace();
7)finally中声明的是一定会被执行的代码。即使catch中又出现异常、try/catch中有return语句等情况
8)像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。

package test;

import org.junit.Test;

public class ExceptionTest1 {

    @Test
    public void test1(){
        String str = "1223";
        str = "abc";
        try{
            int num = Integer.parseInt(str);
            System.out.println("----1");
        }catch (NumberFormatException e){
            System.out.println("出现数值转换异常");
        }
        System.out.println("----2");
        }
}

throws

1)"throws + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!
2)try-catch-finally:真正的将异常给处理掉了
3)throw只是将异常抛给了方法的调用者
4) 重写方法异常抛出的规则: 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型

如何选择try-catch与throws

1)如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。
2)执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throw的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。

手动抛出异常

package test;

public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student();
        try {
            student.regist(-10);
            System.out.println(student);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }
}

class Student{
    private int id;
    public void regist (int id) throws Exception {
        if(id > 0){
            this.id = id;
        }else {
            //手动抛出异常对象
            // throw new RuntimeException("非法数据"); //此处是运行时异常,所以不会编译报错
            throw new Exception("非法数据");
        }
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                '}';
    }
}

自定义异常类

1)继承于现有的异常结构 ExceptionRuntimeException
2)提供全局常量:serialVersionUID
3)提供重载的构造器

public class MyException extends Exception{

    static final long serialVersionUID = -702321312412L;

    public MyException(){

    }

    public MyException(String msg){
        super(msg);
    }
}

练习

在这里插入图片描述

在idea中想要设置main方法的args[]实参:
在这里插入图片描述
在这里插入图片描述)

package test;

public class EcmDef {
    public static void main(String[] args) {
        try {
            int i =Integer.parseInt(args[0]);
            int j =Integer.parseInt(args[1]);

            int result = ecm(i,j);
            System.out.println(result);
        }  catch (NumberFormatException e){
            System.out.println("数据类型不一致");
        } catch (ArrayIndexOutOfBoundsException e){
            System.out.println("缺少命令行参数");
        } catch (ArithmeticException e){
            System.out.println("算数异常");
        } catch (EcDef e) {
            System.out.println(e.getMessage());
        }
    }


    public static int ecm (int i , int j) throws EcDef {
        if(i < 0 || j < 0){
            throw new EcDef("分子或分母为负数");
        }
        return i/j;
    }
}

标签:13,Java,软件设计,System,println,catch,异常,public,out
From: https://blog.csdn.net/thm19990903/article/details/140265707

相关文章

  • Java方法重写,匿名对象,抽象类
    1-方法重写什么是方法重写?子类和父类出现了一模一样的方法的声明(方法名,参数列表)为什么要学习方法重写?当子类需要使用父类的功能,但是父类的功能又满足不了子类,那么子类需要重写,这样既可以使用父类的功能,也可以增加新的功能如果进行方法重写?子......
  • leetcode 135.分发糖果
    题目:n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到1个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目。题目示例:示例1:......
  • JavaWeb__HTML&CSS
    目录一、HTML1、网页的组成部分2、HTML文件的书写规范3.HTML标签的介绍4、标签的语法5、常用标签介绍二、CSS1、CSS技术介绍2、CSS语法规则3、CSS和HTML的结合方式3.1、行内式3.2、内嵌式3.3、外部样式表4、CSS选择器4.1、标签名选择器4.2、id选择器4.3、class选择......
  • JavaScript总结2
    概述JavaScript是世界上最流行的脚本语言。JavaScript是一种轻量级的编程语言,可以插入HTML页面的编程代码。JavaScript插入HTML页面后,可由浏览器执行。特点语法简单,易学易用;解释性语言;跨平台,基于对象和事件驱动,可用于客户端。作用可以动态改变网页内容,网页外观;验证表......
  • Java面试八股之MySQL主从复制机制简述
    MySQL主从复制机制简述MySQL的主从复制机制是一种数据复制方案,用于在多个服务器之间同步数据。此机制允许从一个服务器(主服务器)到一个或多个其他服务器(从服务器)进行数据的复制,从而增强数据冗余、提高读取性能,并且为灾难恢复提供保障。以下是MySQL主从复制机制的简要概述:复制......
  • Maven工程下:alibaba fastjson2的各种序列化:java对象转json对象、json对象转java对象
    pom文件导入fastjson2坐标:<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.51</version></dependency>UserVO对象:@Data@AllArgsConstructor......
  • java比较json对象是否相等
    一、需求需要对比这2个json字符串是否完全一样(不用管顺序)1Stringdui="{\"adGroupVO\":{\"campaignId\":\"CAMPAIGN201912101000004559\",\"adGroupChannel\":{\"channelType\":\"SMS\",\"resourceCode\&......
  • Java并发基础
    多线程的出现是要解决什么问题的?本质什么?CPU、内存、I/O设备的速度是有极大差异的,为了合理利用CPU的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为:CPU增加了缓存,以均衡与内存的速度差异;//导致可见性问题操作系统增加了进程......
  • 如何优化Java中的文件读写性能?
    如何优化Java中的文件读写性能?大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!1.使用缓冲流提升文件读写效率1.1.使用BufferedInputStream和BufferedOutputStream在Java中,使用缓冲流可以显著提升文件读写的效率,尤其是对于大文件而言。以下是一个简单......
  • 使用Java构建可靠的分布式缓存系统
    使用Java构建可靠的分布式缓存系统大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!1.分布式缓存系统概述在现代软件架构中,分布式缓存系统扮演着至关重要的角色,它能够显著提升系统的性能和扩展性。本文将探讨如何使用Java构建一个可靠的分布式缓存系统,利......