处理Java异常的初学者

时间:2017-05-28 09:32:18

标签: java exception

我正在学习java异常,并且在一个特定的例子中遇到了问题。

下面你看我的班级ErgaenztesAuto和我的主要方法。我的做法是有效的。 我不明白的两件事:

  1. 如果我尝试访问对象外部的try块,例如ErgaenztesAuto2.meldung()编译器告诉我他没有找到对象ErgaenztesAuto2。如果我在try块中做同样的事情就可以了。因此,我必须将整个程序放在try块中。 什么是正确的方法?就像只将我期望运行的代码放入一个例外。

  2. 一旦我的构造函数抛出异常,程序就会停止并显示自定义异常消息。不执行异常后的代码。如何在构造函数中处理异常处理的exeption处理,并且仍然执行其余的代码。

  3. 谢谢! 勒

    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());
        }
    

3 个答案:

答案 0 :(得分:1)

当你抛出异常时,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 :(得分:1)

广告1。

拆分声明和初始化:

MyObject myObject;
try{
    myObject = new MyObject();
} except (SomeExceptione) {
    e.doSomethingWithException();
}

myObject.performObjectAction();

广告2。

我不确定我是否理解这一部分:

  

如何放置异常处理的exeption处理   在构造函数中正在处理,其余的代码是   仍然执行。

但是如果你的意思是执行某些事情,无论是否抛出异常,你都应该使用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();

答案 2 :(得分:1)

让我在刚才的脑海中提出一些观点:

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行和#34;)

    // 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规范,这里我把一个作为" Camel Case命名&#34 ;; 所以你的对象'名称可以更改 从

ErgaenztesAuto ErgaenztesAuto1 ; 
ErgaenztesAuto ErgaenztesAuto2 ; 

ErgaenztesAuto ergaenztesAuto1 ; 
ErgaenztesAuto ergaenztesAuto2 ; 

感谢。