百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Java异常之抛出异常详解和代码举例

toyiye 2024-07-08 00:55 19 浏览 0 评论

#挑战30天在头条写日记#

抛出异常

1.在捕获异常之前,必须有一段代码生成并抛出一个异常对象。

2.异常类型不同,抛出异常的方法也不同,分为:系统自动抛出的异常、指定方法抛 出的异常。

3.系统定义的异常由系统抛出;指定方法抛出的异常需使用关键字throw或throws;

我们主要讨论由方法抛出的异常用法。

1.抛出异常的方法与调用方法处理异常

  1. 异常的产生和处理可以在一个方法内进行;
  2. 异常的产生和处理也可以不在一个方法中,即一个方法产生异常,由该方法的调用者去处理异常

相对应地,异常有关的方法就有两个:有抛出异常的方法 和处理异常的方法。

2.抛出异常的方法

  1. 在方法体内使用throw抛出异常:throw 由异常类产生的对象;
  2. 在方法头部添加throws抛出异常:
[修饰符] 返回值类型 方法名([参数列表]) throws 异常列表{
… …
}

由上述两种方式抛出异常,在该方法内就不必提供try-catch-finally 块去处理异常,有调用者的程序处理。

3.处理异常的方法

1.如果程序设计者调用了一个会抛出异常的方法,要么处理这个异常,要么将异常继续抛出。

示例1:方法内部抛出异常、处理异常

package ch09; 
public class Demo{ 
	public static void main(String[] args){ 
		int a=5,b=0; 
		try{ 
			if(b==0) 
				throw new ArithmeticException();  //抛出异常 
			else 
				System.out.println(a+"/"+b+"="+a/b); 
		}catch(ArithmeticException e){  //方法内处理异常 
			System.out.println("异常:"+e+" 被抛出了!"); 
		e.printStackTrace(); 
		} 
	} 
} 

示例2:

package ch09; 
public class Demo{ 
	public static double multi(int n){ 
		if(n<0) //该方法将抛出非法参数异常 
		throw new IllegalArgumentException("求负数阶乘异常");  
		double s=1; 
		for(int i=1;i<=n;i++)  s=s*i; 
		return s; 
		} 
	public static void main(String[] args){ 
		try{ 
			int m=Integer.parseInt(args[0]); 
			System.out.println(m+"!="+multi(m)); 
		}catch(ArrayIndexOutOfBoundsException e){ 
			System.out.println("命令行中没提供参数!"); 
		}catch(NumberFormatException e){ 
			System.out.println("应输入一个【整数】!"); 
		}catch(IllegalArgumentException e){  //main方法捕获并处理非法参数异常 
			System.out.println("出现的异常是:"+e.toString()); 
		}finally{ 
			System.out.println("程序运行结束!!"); 
		} 
	} 
} 

示例3:

package ch09; 
public class Demo{ 
	static void check(String str1) throws NullPointerException{ 
		if(str1.length()>2){ 
		str1=null; 
		System.out.println(str1.length()); //将抛出空指针异常 
	} 
	char ch; 
	for (int i=0;i<str1.length();i++){ 
		ch=str1.charAt(i); 
		if(!Character.isDigit(ch)) 
		throw new NumberFormatException(); 
	} 
} 
	public static void main(String[] args) throws Exception{ 
		int num; 
		try{ 
			check(args[0]); 
			num=Integer.parseInt(args[0]); 
			if (num>60) 
				System.out.println("成绩为:"+num+"  及格"); 
			else 
				System.out.println("成绩为:"+num+"  不及格"); 
		}catch(NullPointerException e){ 
			System.out.println("空指针异常:"+e.toString()); 
		}catch (NumberFormatException ex){ 
			System.out.println("输入的参数不是数值类型"); 
		}catch (Exception e){ 
			System.out.println("命令行中没有提供参数"); 
		} 
	} 
}

2.由方法抛出的异常交给系统处理(需要明确Java对异常强制检查要求的知识)

  1. Java 对 Exception 类中的异常可分为受检查型异常和非检查型异常两大类。
  2. 所有非检查型异常都是RuntimeException类的子类,Java编译器对非检 查型异常不要求进行捕获和处理也能通过编译;而对不是RuntimeException类子类的异常则都是受检查型异常,即如方法 抛出这类异常,调用者必须处理该异常。
  3. 对于受检查型异常,如果调用者不处理,则必须在最后的 main 方法中将 异常提交给系统。
 
示例1:异常最后由main方法提交给系统 
package ch09; 
import java.io.FileInputStream; 
import java.io.IOException; 
public class Demo{  
	public static void main(String[] args) throws IOException{ //删掉异常将不能通过编译 
		FileInputStream fis=new FileInputStream("12.txt"); 
	} 
}  

示例2:

package ch09; 
import java.io.*; 
import java.util.Scanner; 
public class Demo{ 
	public static void main(String[] args) throws IOException{ 
		String str; 
		//以下注释部分用Scanner方式替代 
		//BufferedReader buf; 
		//buf=new BufferedReader(new InputStreamReader(System.in)); 
		Scanner sc=new Scanner(System.in); 
		while (true){ 
			try{ 
				System.out.print("请输入字符串:"); 
				//str=buf.readLine(); 
				str=sc.nextLine(); 
				if(str.length()>0) 
					break; 
				else 
					throw new IOException(); 
			}catch (IOException e){ 
				System.out.println("必须输入字符串!!"); 
				continue; 
			} 
		} 
		String s=str.toUpperCase(); 
		System.out.println("转换后的字符串为:"+s); 
		sc.close(); 
	} 
} 

相关推荐

「linux专栏」top命令用法详解,再也不怕看不懂top了

在linux系统中,我们经常使用到的一个命令就是top,它主要是用来显示系统运行中所有的进程和进程对应资源的使用等信息,所有的用户都可以使用top命令。top命令内容量丰富,可令使用者头疼的是无法全部...

Linux 中借助 perf 对 php 程序模拟CPU高的案例分析

导语本文是一篇Linux借助工具分析CPU高的优化案例,没有任何干货内容,很详细的展示了优化CPU高的具体步骤,非常适合初中级读者阅读!...

centos漏洞处理方法(centos podman)

centos服务器最近有诸多漏洞,修复命令及对应的漏洞整理后,分享给大家RHSA-2020:1176-低危:avahi安全更新yumupdateavahi-libsRHSA-2017:326...

Linux上的free命令详解(Buffer和Cache)

解释一下Linux上free命令的输出。下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(FreeOutput)。例如:FO[2][1]...

linux 命令行之你真的会用吗?--free 基本用法篇

free命令行统计内存使用率及swap交换分区的使用率数据。是由sourceforge负责维护的,在ubuntu上其包名为procps,这个源码包中,除了free还有ps,top,vmstat,ki...

kong api gateway 初体验(konga github)

kongapigateway初体验(firstsight?)。Kong是一个可扩展的开源API层(也称为API网关或API中间件)。Kong运行在任何RESTfulAPI的前面,并通过插件...

在Ubuntu下开启IP转发的方法(ubuntu20 ip)

IP地址分为公有ip地址和私有ip地址,PublicAddress是由INIC(internetnetworkinformationcenter)负责的,这些IP地址分配给了注册并向INIC提...

基于 Kubernetes 的 Serverless PaaS 稳定性建设万字总结

作者:许成铭(竞霄)数字经济的今天,云计算俨然已经作为基础设施融入到人们的日常生活中,稳定性作为云产品的基本要求,研发人员的技术底线,其不仅仅是文档里承诺的几个九的SLA数字,更是与客户切身利益乃...

跟老韩学Ubuntu Linux系列-sysctl 帮助文档

sysctl一般用于基于内核级别的系统调优,man帮助手册如下。...

如何在 Linux/Unix/Windows 中发现隐藏的进程和端口

unhide是一个小巧的网络取证工具,能够发现那些借助rootkit、LKM及其它技术隐藏的进程和TCP/UDP端口。这个工具在Linux、UNIX类、MS-Windows等操作系统下都...

跟老韩学Ubuntu Server 2204-Linux性能管理-uptime指令帮助手册

uptime指令是每个从事Linux系统工作的相关同学必知必会的指令之一,如下是uptime指令的帮助手册。UPTIME(1)...

Openwrt+Rclone+emby+KODI搭建完美家庭影音服务器

特别声明:本篇内容参考了波仔分享,在此表示感谢!上一篇《Openwrt+emby+KODI搭建家庭影音服务器》只适用影音下载到本地的情形,不能播放云盘中的影音,内容较少,缺少了趣味性,也不直观。...

Linux Shell脚本经典案例(linux shell脚本例子)

编写Shell过程中注意事项:开头加解释器:#!/bin/bash语法缩进,使用四个空格;多加注释说明。命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。默认变量是全局的,在函数...

解决 Linux 性能瓶颈的黄金 60 秒

如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断。...

跟老韩学Ubuntu Server 2204-Linux性能管理-vmstat指令帮助手册

vmstat可查看ubuntlinux的综合性能,是每个从事Linux人员必知必会、需掌握的核心指令之一。vmstat指令帮助手册如下。VMSTAT(8)...

取消回复欢迎 发表评论:

请填写验证码