try块中包含的是可能会出现异常的代码, 加入你觉得你的这段代码可能有异常,你就可以把他放到try{}块中 catch(Exception e){}块是紧跟着try{}块的,他的作用是报告try{}块中的异常,你可以在catch(Exception e){}块中干任何事情throws Exception 也是异常处理的一种方式,但是他不是显示的处理异常,而是把方法产生的异常交给类或者类的父类处理fillRect()就是 Fills the specified rectangle,他绘制一个矩形 fillRect(int x, int y, int width, int height) 的参数 int x,int y表示这个矩形的左上角的坐标,int width,int height表示这个矩形的宽和高
try中写有可能抛出异常的语句 catch写相应异常的处理方法例如: InputStreamReader ir = new InputStreamReader( System.in ); BufferedReader in = new BufferedReader( ir ); String s; try{ s = in.readline();//此句可能抛出IO Exception } catch( IOException e ){ System.out.println( "IO Error" ); }
另外throws是用在方法的声明中的,它表示这个方法有可能出现什么样的异常,并且该异常不会有方法自己进行处理,而交给主调方法进行处理,例如:class Test{ public void input() throws IOException { InputStreamReader ir = new InputStreamReader( System.in ); BufferedReader in = new BufferedReader( ir ); String s; s = in.readline(); //此句可能抛出IOException,但是我在该方法中并不作处理 System.out.println( "Input is " + s ); } public static void main( String args[] ){ try{ input();//调用上面的方法 } catch( IOException e ){ //上面的方法中产生的IOException在此处进行处理 System.out.println( "IO Error!" ); } }
加入你觉得你的这段代码可能有异常,你就可以把他放到try{}块中
catch(Exception e){}块是紧跟着try{}块的,他的作用是报告try{}块中的异常,你可以在catch(Exception e){}块中干任何事情throws Exception 也是异常处理的一种方式,但是他不是显示的处理异常,而是把方法产生的异常交给类或者类的父类处理fillRect()就是 Fills the specified rectangle,他绘制一个矩形
fillRect(int x, int y, int width, int height)
的参数 int x,int y表示这个矩形的左上角的坐标,int width,int height表示这个矩形的宽和高
catch写相应异常的处理方法例如:
InputStreamReader ir = new InputStreamReader( System.in );
BufferedReader in = new BufferedReader( ir );
String s;
try{
s = in.readline();//此句可能抛出IO Exception
}
catch( IOException e ){
System.out.println( "IO Error" );
}
public void input() throws IOException {
InputStreamReader ir = new InputStreamReader( System.in );
BufferedReader in = new BufferedReader( ir );
String s;
s = in.readline();
//此句可能抛出IOException,但是我在该方法中并不作处理
System.out.println( "Input is " + s );
} public static void main( String args[] ){
try{
input();//调用上面的方法
}
catch( IOException e ){
//上面的方法中产生的IOException在此处进行处理
System.out.println( "IO Error!" );
}
}
--------------------------
有些东东必须要你用try catch的,例如涉及到sql时。
我现在还没有用到
这种异常处理机制带来的好处:
 Advantage 1: Separating Error Handling Code from "Regular" Code
 Advantage 2: Propagating Errors Up the Call Stack
 Advantage 3: Grouping Error Types and Error Differentiation
异常的类继承结构。
java.lang.Object
|
+--java.lang.Throwable 这是一个类,不是接口
|
+--java.lang.Exception
|
+--java.lang.RuntimeException
|
+--java.lang.IndexOutOfBoundsException
+--java.lang.ArrayIndexOutOfBoundsException +--java.lang.StringIndexOutOfBoundsException
1. 一个Exception的实例对象,或者是它的子类但不是RuntimeException类的实例对象,那么是Checked Exception. 换句话说,不是RuntimeExcetion类的实例也不是RuntimeException子类的实例,那么就是CheckedExcepiton,见上图的左箭头的类指向的类就是CheckedException类。
2.对于在方法引用会出异常的代码, 必须1)写异常处理程序(catch); 2)在方
法定义中写throws语句(specify),除非异常是RuntimeException。
3. 扔出一个异常的语句是 throw new XXXException(); 不要在其它语句行
定义异常实例对象,然后再扔出该对象,这样会给报错理解困难。
4.一个方法定义了抛出异常,但不必在语句体中一定要扔出异常。
5. throw语句后面不能再有可执行语句, 因为它们肯定不会被执行.
6. 在方法里不能抛出未在方法声明中定义的异常,除非是RuntimeException
7. 覆盖方法不能扔出一个checked exception除非被覆盖方法也扔出该异常
或者该异常的父类。.处理异常的语句结构是
try {
执行语句;
} catch(Exception e) {
异常处理程序;
} finally {
最后必须执行的语句;
}
finally语句一定会执行, 即使在catch语句中有return语句! 但除了System.exit()语句,或者cpu停止运行,系统异常终止等特殊情况。
Specified handler&general handler. 在你的catch语句中, 如果你的错误异常有子类, 那么它就是general handler. 它除了处理它本身的异常实例外还处理它的子类实例, 所以general handler写在子类的前面会导致编译错误! 因为后面的子类catch根本得不到执行!
catch语句只会执行一个!!!所以你不要指望执行一个catch后还会执行其它catch语句, 它只会执行下面的finally语句!!!另外, try 语句体中可能会出现的异常(checked exception)必须被捕获! 不允许没有catch语句与那些throw对应! 但是, 如果try语句体中什么异常也不会出现的话, 那么允许一个catch语句也没有!!!这一点对于那些RuntimeException特别有用, 因为它们不一定会发生, 系统(编译器)不强求必须有catch语句与它们对应. 而且, 在你的方法定义中, 也没有必要指定抛出那些RuntimeException, 例如ArrayIndexOutOfBoundsException, 不过声明他们也没关系! 编译器对于RuntimeException允许没有捕获!(try-catch-finally要求!)所以, 对于从RuntimeException继承下来的异常, 系统(编译器)不要求必须声明, 即使声明了, 也不要求必须处理!
但是无论如何, try语句必须有catch或者finally对应, 如果没有catch, 那么必须有finally. 如果没有finally, 那么必须有catch.
Runtime Exception的好处是显而易见的, 非常灵活, 程序员愿意写从RuntimeException继承下来的自己的异常处理类, 因为它们声明灵活, 处理也灵活, 但也带来许多不好的地方, 如果一个异常必须被知道, 被处理, 那么还是不采用RuntimeException好, 因为任何调用这些类和方法的调用者必须清楚, 使用这段代码可能出错, 您必须提供错误处理!!!这也正是checked exception的好处, 例如调用者必须知道磁盘已经满了, 没有空间供您使用!
1. 需要额外注意的是从Throwable类继承下来的Error类,它的处理就象
RuntimeException一样。
2. 在有多个catch()语句与try相对应时,越general的Exception捕获越应靠
后。否则编译错误。例如FileNotFoundException和IOException和
Exception的 关系
3. finally语句一定会执行,除了,系统退出System.exit();电源关闭;线程
死掉;在finally语句体中有一个异常出现。
4. throw语句和throws声明
在程序中throw new IOException(“File not found.”);
那么在语句体声明中必须有throws IOExcepion;与之对应,除非是RuntimeException(举例说明)
5. RuntimeException和Checked Exceptions的区别
RuntimeException不需要程序员显式处理,例如ArithmeticException,
throw new ArithmeticException时,方法体声明中不需要相应的throws
ArithmeticException与之配合,或者,真正抛出ArithmeticException的地
方也不需要catch(ArithmeticException)。
但checked Exception则必须声明,或者必须捕获。例如IOException.
程序中throw new Exception()语句后,不应该有顺序执行的语句,因为它
们根本得不到执行。
对于系统中没有准确恰当的异常和应用所需的异常对应时,应该编写自
己的异常,例如,
RecordNotFoundException,UserAlreadyExistException等等。
6. 异常类一般有两个构造器,一个是无参数的,一个是带有字符串参数的。
try {
// The guarded region:
// Dangerous stuff that might throw A, B, or C
} catch (A a1) {
// Handle A
} catch (B b1) {
// Handle B
} catch (C c1) {
// Handle C
} finally {
// Stuff that happens every time
}
违例准则
用违例做下面这些事情:
1)解决问题并再次调用造成违例方法;
2)平息事态的发展,并在不重新尝试方法的前提下继续;
3)计算另一些结果,而不是希望方法产生的结果;
4)在当前环境中尽可能解决问题,并且将相同的违例重新“掷”出一个更高级的环境;
5)在当前环境中尽可能解决问题,并且将不同的违例重新“掷”出一个更高级的环境;
6)中止程序的执行;
7)简化编码。若违例方案使事情变得更加复杂,那就会令人非常烦恼,不如不用;
8)使自己的库和程序变得更加安全,这既是一种“短期投资”(便于调试),也是一种“长期投资”(改善应用程序的健壮性)。