头歌 11-4 异常处理的应用

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

任务描述

本关任务:完成异常类选择题。

为了完成本关任务,你需要掌握: 1.什么是异常;

2.如何使用异常。

什么是异常

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

程序在运行的时候,发生了一些不被预期的事件,从而没有按照我们编写的代码执行,这就是异常。

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

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

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

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

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

 
  1. ```
  2. String str = null;
  3. int length = str.length();
  4. ```

3.要打开的文件不存在;

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

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

  1. 检查性异常;

  2. 运行时异常;

  3. 错误。

检查性异常

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

 
  1. File f = new File("G://test.java");
  2. FileInputStream fs = new FileInputStream(f);

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

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

运行时异常

运行时异常程序员可以不去处理,当异常出现时,虚拟机会处理。

常见的运行时异常:

 
  1. ClassCastException(类转换异常)
  2. IndexOutOfBoundsException(数组越界)
  3. NullPointerException(空指针)
  4. ArrayStoreException(数据存储异常,操作数组时类型不一致)
错误

错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

Exception 类

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

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

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

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

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

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

第2关:抛出异常

任务描述

本关任务:抛出程序的异常。

相关知识

为了完成本关任务,你需要掌握:1. 如何使用throwthrows关键字。

throws 关键字

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

答案是可以的!

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

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

例如:

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

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

抛出异常,就像我们平常所说的“甩锅”,总有一个人要背锅,在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. }

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

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

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

举个例子:

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

编程要求

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

  • 异常的抛出和处理。
测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。 预期输出:该文件不存在

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 *********/
}
 
 
 

第3关:自定义异常

任务描述

本关任务:定义和使用自定义异常。

相关知识

为了完成本关任务,你需要掌握:

1.为什么要自定义异常;

2.怎么使用自定义异常。

自定义异常

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

使用自定义异常

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

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

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

一个简单的自定义异常:

输出:我是自定义异常

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

编程要求

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

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

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

输入:

admin

输出:

用户名格式正确

输入:

ab

输出:

Exception in thread "main" step4.MyException: 用户名小于三位Exception at step4.Task.main(Task.java:13)

注意:因为抛出异常时会显示行号,请在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{
	public MyException(){}
	public MyException(String msg){
		super(msg);
	}
}
/********* End *********/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值