Java動手動腦04
Java動手動腦04
計算時表示式除數為零:
原始碼:
import javax.swing.*;
class AboutException {
public static void main(String[] a)
{
int i=1, j=0, k;
k=i/j;
try
{
k = i/j; // Causes division-by-zero exception
//throw new Exception("Hello.Exception!");
}
catch ( ArithmeticException e)
{
System.out.println("被0除. "+ e.getMessage());
}
catch (Exception e)
{
if (e instanceof ArithmeticException)
System.out.println("被0除");
else
{
System.out.println(e.getMessage());
}
}
finally
{
JOptionPane.showConfirmDialog(null,"OK");
}
}
}
心得:
執行之後有了以下提示:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at AboutException.main(AboutException.java:7
但是我使用以下程式碼:
import javax.swing.*;
class AboutException {
public static void main(String[] a)
{
int i=1, j=0, k;
k=i/j;
}
}
仍會給出上述的提示。
仔細讀了一下程式碼發現是因為上述程式碼在try程式碼塊之前就已經寫出了分母為零的運算式,後面的對丟擲的程式碼也就沒有實現。刪除那條語句之後便有了以下提示:
第一個catch
被0除. / by zero
還有一個輸出框提示。
若把第一個catch註釋掉第二個catch便會執行,則有一下提示:
第二個catch
被0除
並有一個輸出框提示。
若try語句裡面有問題並丟擲了問題,若被一個catch接收了,則丟擲的東西不會再被下一個catch接受,但是最後的finally語句塊一直都會執行的。
CatchWho:
原始碼:
public class CatchWho {
public static void main(String[] args) {
try {
try {
throw new ArrayIndexOutOfBoundsException();
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/內層try-catch");
}
throw new ArithmeticException();
}
catch(ArithmeticException e) {
System.out.println("發生ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException" + "/外層try-catch");
}
}
}
心得:
上述程式碼的執行測試結果為:
ArrayIndexOutOfBoundsException/內層try-catch
發生ArithmeticException
由此可得catch會優先與最近的try結合。
Catchwho2:
原始碼:
public class CatchWho2 {
public static void main(String[] args) {
try {
try {
throw new ArrayIndexOutOfBoundsException();
}
catch(ArithmeticException e) {
System.out.println( "發生內層ArithmeticException");
}
throw new ArithmeticException();
}
catch(ArithmeticException e) {
System.out.println("發生外層ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println( "ArrayIndexOutOfBoundsException");
}
}
}
執行測試結果:
ArrayIndexOutOfBoundsException
心得:
若丟擲的錯誤沒有被catch語句接住,同一個try程式碼塊的接下來的語句也就不會再執行了,直接跳出這段程式碼塊之後,被下一個合適的catch語句(外層的)接住。
EmbededFinally:
原始碼:
public class EmbededFinally {
public static void main(String args[]) {
int result;
try {
System.out.println("in Level 1");
try {
System.out.println("in Level 2");
// result=100/0; //Level 2
try {
System.out.println("in Level 3");
result=100/0; //Level 3
}
catch (Exception e) {
System.out.println("Level 3:" + e.getClass().toString());
}
finally {
System.out.println("In Level 3 finally");
}
// result=100/0; //Level 2
}
catch (Exception e) {
System.out.println("Level 2:" + e.getClass().toString());
}
finally {
System.out.println("In Level 2 finally");
}
// result = 100 / 0; //level 1
}
catch (Exception e) {
System.out.println("Level 1:" + e.getClass().toString());
}
finally {
System.out.println("In Level 1 finally");
}
}
}
執行測試結果:
當異常在第三層try語句丟擲的時候,finally語句的執行順序是按照由第三層到第一層的順序由內到外一步步執行的。
當異常在第二層被丟擲時,finally語句是從第二層到第一層的順序由內到外執行的。
當異常是在第一層的後面丟擲的,由於finally無論對應的程式碼部分是否丟擲異常都會執行,因此先是執行了第三層和第二層finally語句,而後執行第一層的catch語句,再執行第一層的finally語句。
Finally語句塊是不是一定會執行:
源程式:
public class SystemExitAndFinally {
public static void main(String[] args)
{
try{
System.out.println("in main");
throw new Exception("Exception is thrown in main");
//System.exit(0);
}
catch(Exception e)
{
System.out.println("catch語句執行!");
//System.out.println(e.getMessage());
System.exit(0);
}
finally
{
System.out.println("finally語句執行!");
//System.out.println("in finally");
}
}
}
執行測試結果:
當在catch語句中加入System.exit(0);語句時,執行結果為:
in main
catch語句執行!
即是後面的finally語句並沒有被執行。
當catch語句中沒有上述語句時,finally語句自然會正常執行。
而當在try語句中出現上述語句則會報錯,需要刪去這條語句。
心得:
之前的程式碼無論是否丟擲錯誤,後面的finally語句一般情況下都是會執行的。但是當在catch語句中加上System.exit(0);之後,程式便不會執行後面的內容了,finally語句自然也不會執行了。
PrintExceptionStack:
原始碼:
// UsingExceptions.java
// Demonstrating the getMessage and printStackTrace
// methods inherited into all exception classes.
public class PrintExceptionStack {
public static void main( String args[] )
{
try {
method1();
}
catch ( Exception e ) {
System.err.println( e.getMessage() + "\n" );
e.printStackTrace();
}
}
public static void method1() throws Exception
{
method2();
}
public static void method2() throws Exception
{
method3();
}
public static void method3() throws Exception
{
throw new Exception( "method3" );
}
}
執行測試結果:
method3
java.lang.Exception: method3
at PrintExceptionStack.method3(PrintExceptionStack.java:28)
at PrintExceptionStack.method2(PrintExceptionStack.java:23)
at PrintExceptionStack.method1(PrintExceptionStack.java:18)
at PrintExceptionStack.main(PrintExceptionStack.java:8)
心得:
由此可得丟擲的錯誤是按照棧的儲存方式儲存的,即先進後出,因此的得到了上述的輸出結果。