整理了一下异常处理的几种方式,写了个小的不能再小的例子说明一下问题:
一,直接抛出异常:(注释写的很清楚)
package javase;
/**
* 这种情况是抛出异常(throw)
* 将自然数转换为二进制或八进制字符串
* @author 幸运皮
* @param value 需要转换的自然数
* @param radix 基数,只能取2或8
* @return 转换后的字符串
*/
public class ThrowEx {
public String toString (int value, int radix){
//判断异常的代码
if (value < 0){
throw new IllegalArgumentException ("需要转换的数字不是自然数");
}
if (radix != 2 && radix != 8){ //如果radix既不是2也不是8的情况下抛出异常
throw new IllegalArgumentException ("进制参数非法");
}
if (value == 0){
return "0";
}
StringBuffer s = new StringBuffer();
int temp; //余数
while (value != 0){
temp = value % radix; //取余数
s.insert(0, temp); //加入字符串的以一个位置
value = value / radix; //整除后再赋值给value
}
return s.toString();
}
public static void main (String[] args){
ThrowEx thr = new ThrowEx();
String ss = new String();
int i = 2;
ss = thr.toString(2,22);
System.out.print(ss);
}
}
二,处理异常:(处理异常有好多种方式,下面一一列举)
下面的这些类都在同一个包中
首先定义了一个异常:
Myexception.java
package javase;
/**
* 如果提供的异常不够,那么就自定义异常吧
* @author 幸运皮
*/
/**自定义的异常可以是继承的Exception或者RuntimeException,
如果继承Exception,那这个异常必须要处理的
RuntimeException的,不用强制处理
但是,一般很少自定义异常的
*/
public class MyException extends RuntimeException {
public MyException (){
super("这里出异常了");
}
}
第一种处理方式:不处理
package javase;
/**
* 处理异常之"不处理"——不推荐使用
* 这样,当执行出现异常的时候,就不会输出任何消息
* @author 幸运皮
*/
public class ChuliEx {
public static void main(String[] args){
String s = new String("q123");
try
{
int n = Integer.parseInt(s);
System.out.print(n);
}
catch (NumberFormatException e){
}
}
}
第二种处理方式:直接处理
package javase;
/**
* 处理异常之"直接处理"——提示用户进行正确的操作,常用的一种处理方式
* 这样,当执行出现异常的时候,就不会输出任何消息
* @author 幸运皮
*/
public class ChuliEx2 {
public static void main(String[] args){
String s = new String("123");
//String s = new String("p123");
int n = 0;
try
{
n = Integer.parseInt(s);
System.out.print(n);
}
catch (ArrayIndexOutOfBoundsException e){
System.out.print("请输入命令行参数");
}
catch (NumberFormatException e){
System.out.print("参数不是数字字符");
}
}
}
第三种处理方式:重新抛出异常,具体看注释
package javase;
/**
* 处理异常之"重新抛出处理"——将出现的异常都转换成自己定义的某个异常然后重新抛出
* 这样比较容易发现异常的位置,利于程序出错时候找错误
* @author 幸运皮
*/
public class ChuliEx3 {
public static void main(String[] args){
// String s = new String("123");
String s = new String("p123");
int n = 0;
try
{
n = Integer.parseInt(s);
System.out.print(n);
}
catch (ArrayIndexOutOfBoundsException e){
throw new MyException();
}
catch (NumberFormatException e){
throw new MyException(); //这是在同一个包中定义的异常
/**
* public class MyException extends RuntimeException {
public MyException (){
super("这里出异常了");
}
}
*/
}
}
}
第四种处理方式:方法中声明,具体实现时再处理
package javase;
/**
* 处理异常之"方法中声明异常"——将出现的异常都转换成自己定义的某个异常然后重新抛出
* @author 幸运皮
*
*/
public class ChuliEx4 {
public ChuliEx4(){}
public void convert(String s) throws NumberFormatException {
//一个是在方法里捕获异常
//其实,完全可以不加throws NumberFormatException 的
//像下面这样:public void convert(String s){是在具体调用方法的时候获取异常
int n = Integer.parseInt(s);
System.out.print(n);
}
public static void main(String[] args){
ChuliEx4 chuli = new ChuliEx4();
try{
chuli.convert("q123");
}
catch (NumberFormatException e){
System.out.print("参数传递类型不是数字型字符");
}
}
}
(谢谢武让的提醒,不过,想了一下,后面还有一个IO例子,要用到finally,所以,就不在这添了)