簡體   English   中英

處理Java異常的初學者

[英]Beginner on handling Java Exceptions

我正在學習Java異常,並且一直對一個特定示例有疑問。

在下面,您可以看到我的類ErgaenztesAuto及其主要方法。 我的專家被抓住並開始工作。 我不明白的兩件事:

  1. 如果我嘗試從try塊外訪問對象,例如ErgaenztesAuto2.meldung(),則編譯器會告訴我他找不到對象ErgaenztesAuto2。 如果我在try塊中做同樣的事情,它會起作用。 因此,我必須將整個程序放在try塊中。 正確的方法是什么? 就像只放置我希望運行的代碼一樣。

  2. 一旦我的構造函數引發異常,程序就會停止,並顯示我的自定義異常消息。 異常后的代碼未執行。 我該如何放置異常處理程序,該異常處理程序在構造函數中負責處理,其余代碼仍在執行。

謝謝! 雷內

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM