2010-10-28 25 views
0
import java.io.*; 

class MyException1 
{ 
static String str=""; 

public static void main(String args[]) 
{ 
BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
System.out.println("Enter your food"); 


try{ 
str=br.readLine(); 
}catch(IOException e){ 
System.out.println("Exception has been occurred"+e); 
} 


try{ 
checkFood(); 
}catch(BadException be){ 
System.out.println("Exception"+be); 
} 
} 


private static void checkFood() throws BadException 
{ 

if(str.equals("Rotten")|| str.equals("")){ 
System.out.println("Bad food"); 
//throw new BadException(); 
throw new BadException("Not Eatable"); 
}else{ 
System.out.println("Good food !! enjoy"); 

} 
} 
} 



class BadException extends Exception 
{ 
String food; 

BadException() 
{ 
super(); 
food="invalid"; 
System.out.println(food); 
} 

BadException(String s) 
{ 
super(s); 
food=s; 
} 

public String getError() 
{ 
return food; 
} 

} 

在程序中,這個public String getError()怎麼返回food變量?我沒有把它叫到任何地方?當從構造函數中調用關鍵字「super」時如何工作?

如果我刪除了行super(s);,則「不可打印」不會打印。但是如果我留下這一行,那麼它會打印出來。這個程序如何工作?

+1

「懷疑」意味着你相信某事是*不真實*,而不是你*困惑*關於某事。告訴你的朋友。 – user359996 2010-10-28 07:17:15

+0

@ user359996:我只是喜歡這部分,「告訴你的朋友」。 ;) – 2010-10-28 07:45:00

回答

2

如果我刪除行超級(S),那麼「不可打印」不打印。但是如果我留下這一行,那麼它會打印出來。這個程序如何工作?

super(s)將調用帶有字符串的「超類」構造函數。就像如果你叫new Exception("Not Eatable")。這個Exception的構造函數向異常中添加一條消息,所以當您打印出來時,它將包含該文本。

這與變量food無關。您可以刪除行food=s;,並且郵件仍然會正確打印。

查看關鍵字super本教程:

http://download.oracle.com/javase/tutorial/java/IandI/super.html

如果你還在困惑super是如何工作的,後來想想這一點。你可以重新編碼BadException這個代碼,你的程序仍然會做同樣的事情:

class BadException extends Exception 
{ 
BadException(String s) 
{ 
    super(s); 
} 
} 

這也將做同樣的事情:

class Test extends Throwable 
{ 
String message; 
Test(String msg) 
{ 
    message = msg; 
} 
public String toString() { 
    return "BadException: " + message; 
} 
} 

class BadException extends Test 
{ 
BadException(String s) 
{ 
    super(s); 
} 
} 
+0

是否在這裏調用getError()?是新的myBadException打印不可食用或getError()打印這不可食用???只有拋出聲明rit? – Sumithra 2010-10-28 07:37:17

+0

@Sumithra:這行打印它 - 「System.out。println(「Exception」+ be);「。」rit「是什麼意思?如果你的意思是」正確的「,那麼這是正確的拼寫... – 2010-10-28 07:41:29

+0

感謝澄清我的疑問!!! – Sumithra 2010-10-28 07:42:24

1

當你throw new BadException("not eatable");你實例化一個新的BadException,它將其成員變量食物設置爲字符串「不可食用」。然後調用getError()將返回該字符串。

這將是更好的風格,以擺脫食物的成員變量,也將讓超級調用(字符串),因爲有一個構造異常(字符串消息)

+0

我現在編輯了它。 – Sumithra 2010-10-28 07:21:13

0

「超級(S);」調用需要一個String的超類的構造函數。這是Exception類。

如果你把「超(s);」,那麼編譯器將隱含把一個「超();」在那裏調用,因爲超類有一個默認的構造函數。 (這就是爲什麼它被稱爲默認構造函數 - 因爲如果你沒有指定其他東西,它將被默認調用)

因爲這與調用「super(null);」相同,所以消息在變量「s」)不會被傳遞到超類,因此它不是打印出來的。

相關問題