第六讲 Java面向对象-Java中的异常 (头歌答案)

这篇具有很好参考价值的文章主要介绍了第六讲 Java面向对象-Java中的异常 (头歌答案)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

第六讲  内部类  异常处理

第1关:Java 中的异常处理机制

第2关:捕获异常

               源码

第3关:抛出异常

              源码:

第4关:自定义异常

              源码

第六讲  内部类  异常处理

第1关:Java 中的异常处理机制

第六讲 Java面向对象-Java中的异常 (头歌答案)

 

(一)什么是异常

异常:程序在运行过程中产生的不正常情况。

一些不被预期的事件,从而没有按照我们编写的代码执行

异常是Java中的错误,但是并不是所有的错误都是异常,比如说,你在定义变量名的时候没有依照Java的规则,在语句的结尾少了一个分号,那么运行出来结果是提示是错误 java.lang.Error

不过如果你用System.out.println(5/0),那这个时候你的程序是可以正常编译的,但是在运行的时候,因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。

异常的原因有很多种,比如:

输入了错误的数据,比如:程序需要的是int类型数据,而用户输入了一串字符串;

对象没有初始化就调用:下面这段代码就会提示空指针异常;

String str = null;

int length = str.length();

要打开的文件不存在;

网络通信时连接中断,或者JVM内存溢出。

要理解Java中的异常是如何工作的,你需要掌握以下三种类型的异常:

检查性异常;

运行时异常;

错误。

检查性异常

例如我们要打开一个文件时,这段代码就可能存在异常,因为这个文件很有可能并不存在。

File f = new File("G://test.java");

FileInputStream fs = new FileInputStream(f);

这里G盘下的test.java文件就可能不存在,这个时候运行这段代码就可能会出异常,所以在我们编写代码的时候IDE会提示我们要处理这段代码可能出现的异常。

如果我们不处理的话,程序是不能被编译的。

运行时异常

运行时异常程序员可以不去处理,当异常出现时,虚拟机会处理。常见的运行时异常有空指针异常。

常见的运行时异常:

ClassCastException(类转换异常)

IndexOutOfBoundsException(数组越界)

NullPointerException(空指针)

ArrayStoreException(数据存储异常,操作数组时类型不一致,数组下标越界)

NumberFormatException

(二)错误

错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。

例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

Exception

所有的异常类都是从 java.lang.Exception 类继承的子类。

Exception 类是 Throwable 类的子类。除了Exception类之外,Throwable还有一个子类Error

Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。

Error 用来指示运行时环境发生的错误。

例如,JVM内存溢出。一般地,程序不会从错误中恢复。

异常类有两个主要的子类:IOException 类和 RuntimeException 类。

第六讲 Java面向对象-Java中的异常 (头歌答案)

 可检查异常:

不可检查异常:

第二关:捕获异常

检测性异常:有一部分异常是需要程序员提前处理的

如果我们不处理,程序是不能编译通过的,在IDE中也会出现一条红线。第六讲 Java面向对象-Java中的异常 (头歌答案)

 这个时候我们就必须处理这段可能出现异常的程序。

如何处理呢?

Java中提供了一个捕获异常的机制:try-catch

通过这两个单词的字面意思我们就能很好的理解了:try:尝试,catch:捕获; 尝试执行代码A和代码B如果这两段代码有一个出现了异常,就会执行catch中的语句,如果代码A、B都不存在异常就不会执行catch代码,最后继续执行代码C。

所以之前报错的代码我们这样写就没错啦:第六讲 Java面向对象-Java中的异常 (头歌答案)

 在这里我们可以发现catch捕获的是FileNotFoundException,这是一个文件未找到异常,所以我们在捕获异常的时候最好要先明确异常的种类是什么。

好奇的同学可能会有疑惑,检测性异常可以用try-catch来处理,那运行时异常可不可以用try-catch来处理呢?

第二关:源码

package step2;

import java.util.Scanner;

public class Task {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num1 = sc.nextInt();
		int num2 = sc.nextInt();
		/********* Begin *********/
		try{
            System.out.println(num1/num2);
        } 
        catch(Exception e){
            System.out.println("除数不能为0");
        }
		/********* End *********/
	}
}

第六讲 Java面向对象-Java中的异常 (头歌答案)

提示:捕获异常需要用特定的类,下表总结了常用的异常类:

非检测型异常:

异常

描述

ArithmeticException

当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。

ArrayIndexOutOfBoundsException

用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。

ClassCastException

当试图将对象强制转换为不是实例的子类时,抛出该异常。

IllegalArgumentException

抛出的异常表明向方法传递了一个不合法或不正确的参数。

IllegalMonitorStateException

抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。

IllegalStateException

在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。

IllegalThreadStateException

线程没有处于请求操作所要求的适当状态时抛出的异常。

IndexOutOfBoundsException

指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。

NegativeArraySizeException

如果应用程序试图创建大小为负的数组,则抛出该异常。

NullPointerException

当应用程序试图在需要对象的地方使用 null 时,抛出该异常

NumberFormatException

当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

StringIndexOutOfBoundsException

此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。

...

...

检测性异常:

异常

描述

ClassNotFoundException

应用程序试图加载类时,找不到相应的类,抛出该异常。

CloneNotSupportedException

当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。

IllegalAccessException

拒绝访问一个类的时候,抛出该异常。

InstantiationException

当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。

InterruptedException

一个线程被另一个线程中断,抛出该异常。

NoSuchFieldException

请求的变量不存在

NoSuchMethodException

请求的方法不存在

IOException及其子类

对文件或流的操作有误时,抛出异常

...

...

第六讲 Java面向对象-Java中的异常 (头歌答案)

第三关: 源码:

package step3;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Task {
	/********* Begin *********/
	//请在合适的部位添加代码
	public static void main(String[] args) throws FileNotFoundException{	
		test();
	}
	public static void test() throws  FileNotFoundException{
		File file = new File("abc");
		if(!file.exists()){		//判断文件是否存在
			//文件不存在,则 抛出 文件不存在异常
			throw new FileNotFoundException("该文件不存在");
		}else{
			FileInputStream fs = new FileInputStream(file);
		}
	}
	/********* End *********/
}

第六讲 Java面向对象-Java中的异常 (头歌答案)

第3关:抛出异常

throws 关键字

上一小节我们学习了如何处理捕获异常,但是我们有时候想偷个懒,不自己处理这些异常,可不可以呢?

答案是可以的!

我们可以将自己不想处理的异常交给别人来处理,怎么实现呢?

很简单我们只需要用throws关键字抛出该异常即可。

例如:第六讲 Java面向对象-Java中的异常 (头歌答案)

 这个时候我们发现IDE报错了,提示我们这里有异常要处理,但是如果我们不想处理,就可以这样:

第六讲 Java面向对象-Java中的异常 (头歌答案)

可以发现test方法内部没有报错了,但是调用test方法的地方报错了。是什么原因呢?

抛出异常,就像我们平常所说的“甩锅”,总有一个人要背锅,在Java中也一样异常最终总是要被处理或者被捕获的,所以我们如果在方法的括号后面抛出一个异常,那么该方法的调用者是必须要捕获这个异常或者将这个异常继续抛出的。

所以上面的错误就会有两种解决办法。

第一种:捕获异常:第六讲 Java面向对象-Java中的异常 (头歌答案)

第二种:把“锅”甩给Java虚拟机:第六讲 Java面向对象-Java中的异常 (头歌答案)

throw 关键字

throw关键字的作用是:主动抛出异常

首先我们来看系统自动抛出异常:

  1. public static void main(String[] args) {
  2.         int a = 10;
  3.         int b = 0;
  4.         System.out.println(a/b);
  5.     }

运行这段代码系统会自动抛出,java.lang.ArithmeticException异常。

这段程序使用throw关键字也可以实现:

  1. public static void main(String[] args) {
  2.     int a = 10;
  3.     int b = 0;
  4.     if(b == 0){
  5.         throw new ArithmeticException("/ by zero");
  6.     }
  7.     System.out.println(a/b);
  8. }

可以发现两段程序的运行结果都类似:

第六讲 Java面向对象-Java中的异常 (头歌答案)

throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常

注意:使用throw关键字主动抛出检测性异常的时候,在方法名上必须使用throws表明调用这个方法可能存在要抛出的异常。

举个例子:

第六讲 Java面向对象-Java中的异常 (头歌答案)

第六讲 Java面向对象-Java中的异常 (头歌答案)

ArithmeticException属于运行时异常,是在运行时检测的,所以上述代码编译是能通过的,而FileNotFoundException是属于检测性异常,是在编译之前就需要处理的,所以第二段程序要加上throws才能通过编译。

第六讲 Java面向对象-Java中的异常 (头歌答案)

第4关:自定义异常

自定义异常

前面谈到的都是系统自带的异常,但是如果我们是在开发一个复杂项目,就经常会遇到系统自带的异常不能满足我们的需求的情况,所以这个时候就需要我们自己来定义异常了。

使用自定义异常

我们一般使用继承Exception的方式来自定义异常,那具体怎么进行呢?

很简单,我们只需要继承Exception,再将信息传递给父类就可以了:

  1. class 自定义异常名 extends Exception{
  2. //因为Exception已经实现了很多异常处理的方法了属性了,
  3. //所以自定义异常只需要将信息传递给父类(使用super关键字)即可
  4. }

一个简单的自定义异常:

第六讲 Java面向对象-Java中的异常 (头歌答案)

输出:我是自定义异常

这样就实现了一个自定义异常的定义和使用啦。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 定义一个自定义异常,判断用户名是否小于三位,如果用户名小于三位,就抛出一个自定义异常。

 第六讲 Java面向对象-Java中的异常 (头歌答案)

 如何修改呢?

注意:因为抛出异常时会显示行号,请在13行抛出异常,否则评测可能不通过。

第四关:源码

package step4;

import java.util.Scanner;

public class Task {
	/********* Begin *********/
	public static void main(String[] args) throws MyException {
		Scanner sc = new Scanner(System.in);
		String username = sc.next();//定义用户名
		
        //判断用户名
        if(username.length()<3)
            throw new MyException("用户名小于三位Exception");
        else
            System.out.println("用户名格式正确");		
	}
}

class MyException extends Exception{
    MyException(String msy){
        super(msy);
    }
}
/********* End *********/

第六讲 Java面向对象-Java中的异常 (头歌答案)

第六讲 Java面向对象-Java中的异常 (头歌答案)文章来源地址https://www.toymoban.com/news/detail-446385.html

到了这里,关于第六讲 Java面向对象-Java中的异常 (头歌答案)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Scala(第六章 面向对象)

    1、 Scala的面向对象思想和Java的面向对象思想和概念是一致的。 2、Scala中语法和Java不同,补充了更多的功能。 1)基本语法 1 2)Scala包的三大作用(和Java一样) 1、区分相同名字的类 2、当类很多时,可以很好的管理类 3、控制访问范围 6.1.1 包的命名 1)命名规则 只能包含数

    2024年02月13日
    浏览(30)
  • 第六章 面向对象的PHP

    作用域:公共 (public)、受保护 (protected)、私有(private) 的属性或方法 公共属性 :公共的属性可以直接通过相应对象进行访问和处理 受保护属性:仅能在内部使用的属性,也可以被衍生类访问或处理 私有属性:只能在定义了该属性的类的内部访问或处理 公共方法:可以在任何

    2024年02月11日
    浏览(33)
  • 头歌Educoder实验:C++ 面向对象 - 类的继承与派生

    第1关:公有继承 —— 学生信息类 任务描述 本关任务:采用公有继承设计学生信息类。 相关知识 继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。简单的说,继承是指一个对象直接使用另一对象的属性和方法。 C++ 中的继承关系就好比现实生

    2024年02月04日
    浏览(106)
  • Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API

    Java 是一种由 Sun Microsystems 于 1995 年首次发布的编程语言和计算平台。Java 是一种通用的、基于类的、面向对象的编程语言,旨在减少实现依赖性。它是一个应用程序开发的计算平台。Java 快速、安全、可靠,因此在笔记本电脑、数据中心、游戏机、科学超级计算机、手机等领

    2024年03月24日
    浏览(75)
  • 【Java基础教程】(三十六)常用类库篇 · 第六讲:数学运算类——全面讲解Java数学计算支持类库,BigDecimal、Math、Random、DecimalFormat...~

    在现代软件开发中,数学计算是不可或缺的一部分。为了满足企业及开发人员对数学运算的需求,Java 提供了一系列强大而丰富的数学计算相关类,其中包括 Math 、 Random 、 BigDecimal 等等。这些类旨在提供高度精确和可靠的数学操作,使开发人员能够处理任何规模和复杂度的定

    2024年02月16日
    浏览(23)
  • 头歌Educoder实验:程序设计二(面向对象)_实训3_类外定义成员函数

    第1关:类外定义存取函数 任务描述 本关仍然有一个 Int 类,该类包含一个 int 类型的成员。为其编写存取函数。注意,存取函数要在类外实现。 相关知识 类的定义中,既可以书写成员函数的声明,也可以书写成员函数的定义(即实现)。如果在类中定义成员函数,则该成员

    2024年02月06日
    浏览(40)
  • 【Django入门】《第六讲》邮件发送

            Django开发时,对于用户注册时我们需要通过邮件给用户发送激活地址。Django有自己的邮件发送库。我们只需要配置好对应的邮件内容就可以了。         在 Django 中发送邮件需要使用内置的 django.core.mail 模块。要发送邮件,需要配置邮件相关的设置,并且安装

    2024年02月11日
    浏览(31)
  • MyBatis第六讲:MyBatis缓存

    MyBatis 提供了一级缓存和二级缓存的支持。默认情况下,MyBatis 只开启一级缓存。 8、1MyBatis一级缓存 一级缓存是基于MyBatis自带的 HashMap 本地缓存,作用范围为 SqlSession 域内。当刷新或者关闭之后,该 SqlSession 中所有的缓存就会被清空。 在参数和 SQL 完全一样的情况下,我们使

    2024年02月11日
    浏览(35)
  • 第六讲:静态路由的原理和配置

    首先我们知道路由器是工作在网络层的,那就是三层设备。网络层的功能主要为:不同网段之间通信、最佳路径选择也就是逻辑地址(ip地址)寻址、转发数据。 ●路由器是能将数据包转发到正确的目的地,并且在转发过程中选择最佳路径的设备,用于不同网络之间的通信。

    2024年02月05日
    浏览(33)
  • 头歌JAVA数据结构答案

    一、Java数据结构-循环链表的设计与实现 第1关 单循环链表的实现—链表的添加、遍历 第2关 单循环链表的实现—链表的删除 第3关 双向循环链表的实现—链表的插入 第4关:双向循环链表的实现—链表的删除 二、Java数据结构-线性表的设计与实现 第1关:顺序表的实现之增删

    2024年02月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包