Java--异常
异常
异常是程序中的一写错误,但所有的错误都是异常。这些异常有的是因为用户错误引起,有的是程序错误引起的。异常发生的原因有很多,通常包括这三类:
- . 用户输入了非法数据
- . 要打开的文件不存在
- . 网络通信时连接中断,或者JVM内存溢出
Exception类
所有的异常类是从 java.lang.Exception 类继承的子类。
捕获异常
使用 try 和 catch 关键字可以捕获异常。
try/catch 代码块放在异常可能发生的地方。try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:
try
{
// 程序代码
}catch(ExceptionName e)
{
//Catch 块
}
当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。
多重捕获
一个try代码块,后面可以跟随多个catch代码块
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}
throw throws
throw
在方法体中使用,只能抛出⼀个异常对象名。
throws
在方法声明上使用,可以跟多个异常类名,用逗号隔开。
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
throws:
import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
finally
finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生常,finally 代码块中的代码总会被执行。
PTA 例题
判断题:
1.所有异常都必须捕获。
F
不一定,理论上只要是代码就可能出现异常,所以不需要所有异常都要进行处理,可以抛给java虚拟机处理
2.一个try语句可以有多个catch语句与之对应。
T
3.异常也是一个对象。
T
4.用户可以自定义自己的异常类。
T
5.可以使用throw语句来抛出异常。
T
6.可以使用throw语句来抛出异常。
T
7.当一个方法在运行过程中产生一个异常,则这个方法会终止,但是整个程序不一定终止运行。
T
8.程序运行时所产生的系统定义的异常将自动被抛出.
T
函数题
1.多种类型异常的捕获
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String choice = sc.next();
try {
if (choice.equals("number"))
throw new NumberFormatException();
else if (choice.equals("illegal")) {
throw new IllegalArgumentException();
} else if (choice.equals("except")) {
throw new Exception();
} else
break;
}
catch (NumberFormatException e) {//捕获number异常
// TODO: handle exception
System.out.println("number format exception");
System.out.println("java.lang.NumberFormatException");
}
catch (IllegalArgumentException e) {//捕获illegal异常
// TODO: handle exception
System.out.println("illegal argument exception");
System.out.println("java.lang.IllegalArgumentException");
}
catch (Exception e) {//捕获except异常
// TODO: handle exception
System.out.println("other exception");
System.out.println("java.lang.Exception");
}
}//end while
sc.close();
}
}
2.求圆面积自定义异常类
class Circle{
double radius;
public Circle(double radius) {
// TODO Auto-generated constructor stub
this.radius=radius;
}
public double area() throws CircleException{
if(radius<0) {
CircleException e=new CircleException(radius);
throw e;
}
return 3.14*radius*radius;
}
}
class CircleException extends Exception{
double radius;
CircleException(double radius){
this.radius=radius;
}
public void print() {
System.out.println("圆半径为"+radius+"不合理");
}
}
编程题
成绩录入时的及格与不及格人数统计
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner inScanner=new Scanner(System.in);
int n=inScanner.nextInt();
int pass=0;
int fail=0;
int i=0;
for ( i= 0; i< n; ) {
int num=inScanner.nextInt();
try{
if (num>100||num<0) {
throw new MyException("invalid!");
}
else if (num>=60) {
pass++;
i++;
}
else if (num<60&&num>=0) {
fail++;
i++;
}
}
catch (MyException e) {
// TODO: handle exception
System.out.println(num+e.toString());
}
}
System.out.println(pass);
System.out.println(fail);
}
}
class MyException extends Exception{
public MyException(String message) {
super(message);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "invalid!";
}
}