[英]Beginner on handling Java Exceptions
我正在學習Java異常,並且一直對一個特定示例有疑問。
在下面,您可以看到我的類ErgaenztesAuto及其主要方法。 我的專家被抓住並開始工作。 我不明白的兩件事:
如果我嘗試從try塊外訪問對象,例如ErgaenztesAuto2.meldung(),則編譯器會告訴我他找不到對象ErgaenztesAuto2。 如果我在try塊中做同樣的事情,它會起作用。 因此,我必須將整個程序放在try塊中。 正確的方法是什么? 就像只放置我希望運行的代碼一樣。
一旦我的構造函數引發異常,程序就會停止,並顯示我的自定義異常消息。 異常后的代碼未執行。 我該如何放置異常處理程序,該異常處理程序在構造函數中負責處理,其余代碼仍在執行。
謝謝! 雷內
public class ErgaenztesAuto {
// Instanzvariablen
private String besitzer;
private String autotyp;
private String farbe;
private int erstzulassung;
private int leistung;
private int kmStand;
private String standort;
private String fahrgestellnummer;
public ErgaenztesAuto(String besitzer, String autotyp, String farbe,
int erstzulassung, int leistung, int kmStand, String standort, String fahrgestellnummer) {
this.besitzer = besitzer;
this.autotyp = autotyp;
this.farbe = farbe;
this.erstzulassung = erstzulassung;
this.leistung = leistung;
this.standort = standort;
this.fahrgestellnummer = fahrgestellnummer;
if (kmStand > 0 ) {
this.kmStand = kmStand;
} else {
throw new IllegalArgumentException("Kein KM Stand kleiner als 0 erlaubt!");
}
}
public class ErgaenztesAutoTest {
public static void main(String[] args) {
try
{
// Objekt erzeugen
ErgaenztesAuto ErgaenztesAuto1 = new ErgaenztesAuto("Rene", "BMW", "Rot", 1981, 90, 10, "Berlin", "ABCD");
ErgaenztesAuto ErgaenztesAuto2 = new ErgaenztesAuto("Rene", "Audi", "Gelb", 2010, 70, -20000, "Muenchen", "WXYZ");
//ErgaenztesAuto ErgaenztesAuto3 = new ErgaenztesAuto("Rene", "Volkswagen", "Blau", 2017, 65, 1000, "Hamburg", "GHIJ");
ErgaenztesAuto1.meldung();
ErgaenztesAuto2.meldung();
}
catch (IllegalArgumentException e)
{
System.out.println("Meine Exception trat auf: " + e.getMessage());
}
引發異常時,將取消執行try塊,然后直接轉到catch塊,然后再進入finally塊。 通過僅將代碼放在必要的try塊中,就可以實現所需的功能。
例如(我組成了一些類名):
Car car = null;
try{
car = new Car(...);
//do something with car
}catch(Exception e){
e.printStackTrace();
}
//code here will still be executed and you can access the car object, be sure to check for nullpointer exception though.
廣告1。
拆分聲明和初始化:
MyObject myObject;
try{
myObject = new MyObject();
} except (SomeExceptione) {
e.doSomethingWithException();
}
myObject.performObjectAction();
廣告2。
我不確定我是否理解這部分內容:
我該如何放置異常處理程序,該異常處理程序在構造函數中負責處理,其余代碼仍在執行。
但是,如果您打算執行某件事,無論是否引發異常,都應該使用finally
塊。
MyObject myObject;
try{
myObject = new MyObject();
} except (SomeExceptione) {
e.doSomethingWithException();
} finally {
System.out.println("This gets executed always. My Object is: " + myObject.toString());
}
myObject.performObjectAction();
現在讓我在腦海中提出您的幾點看法:
1)您在類定義ErgaenztesAuto中沒有meldung()方法; 如我所見,它僅包含一種構造方法。 它應該像這樣:
public void meldung() {
// TODO Auto-generated method stub
// your own code here
}
2)對於要在捕獲異常后繼續運行的代碼,您需要具有FINALLY塊:
try {
// Objekt erzeugen
ErgaenztesAuto ErgaenztesAuto1 = new ErgaenztesAuto("Rene", "BMW", "Rot", 1981, 90, 10, "Berlin", "ABCD");
ErgaenztesAuto ErgaenztesAuto2 = new ErgaenztesAuto("Rene", "Audi", "Gelb", 2010, 70, -20000, "Muenchen", "WXYZ");
ErgaenztesAuto1.meldung();
ErgaenztesAuto2.meldung();
} catch (IllegalArgumentException e) {
System.out.println("Meine Exception trat auf: " + e.getMessage());
} finally {
System.out.println("I'M RUNNING AFTER EXCEPTION !!");
// OTHER CODE LOGIC
}
3)關於對象可見性的部分,請再讀一本Java基礎書籍,它將告訴您如何在不同級別定義不同的對象; 因此代碼如下:(我將其標記為“ 1-2-3行”)
// Objekt erzeugen
ErgaenztesAuto ErgaenztesAuto1 = null; // line 1
ErgaenztesAuto ErgaenztesAuto2 = null; // line 2
try {
ErgaenztesAuto1 = new ErgaenztesAuto("Rene", "BMW", "Rot", 1981, 90, 10, "Berlin", "ABCD");
ErgaenztesAuto2 = new ErgaenztesAuto("Rene", "Audi", "Gelb", 2010, 70, -20000, "Muenchen", "WXYZ");
ErgaenztesAuto1.meldung();
ErgaenztesAuto2.meldung();
} catch (IllegalArgumentException e) {
System.out.println(" ErgaenztesAuto1 object is having errors:" + ErgaenztesAuto1); // line 3
System.out.println("Meine Exception trat auf: " + e.getMessage());
} finally {
System.out.println("I'M RUNNING AFTER EXCEPTION !!");
// OTHER CODE LOGIC
}
4)最后一件事是,通常,您需要遵循一些JAVA規范,這里我將其稱為“駝峰命名”。 這樣您的對象的名稱可以從
ErgaenztesAuto ErgaenztesAuto1 ;
ErgaenztesAuto ErgaenztesAuto2 ;
至
ErgaenztesAuto ergaenztesAuto1 ;
ErgaenztesAuto ergaenztesAuto2 ;
謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.