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

Java语言的异常

  1. 异常处理机制
  2. 异常处理类
  3. 异常的处理
  4. 抛出异常
  5. 自定义异常类
抛出异常 
	1.在捕获异常之前,必须有一段代码生成并抛出一个异常对象。 
	2.异常类型不同,抛出异常的方法也不同,分为:系统自动抛出的异常、指定方法抛 出的异常。 
	3.系统定义的异常由系统抛出;指定方法抛出的异常需使用关键字throwthrows; 
我们主要讨论由方法抛出的异常用法。 
	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(); 
		} 
	} 
} 
 
 

示例2package 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("程序运行结束!!"); 
		} 
	} 
} 

示例3package 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"); 
	} 
}  
示例2package 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(); 
	} 
} 

你可能感兴趣的:(Java语言异常处理,java)