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!";
	}
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号