java中的异常:已声明变量,但编译器无法读取它

时间:2018-11-19 14:27:44

标签: java

我有一个Java程序,该程序有编译错误。我创建了两个类“ magasin”和“ produit”,“ magasin”类包含“ produit”列表

  • 当我们创建“产品”时,会引发“ ProdException”异常。
  • 当我们在“ magasin”类的列表中添加“产品”时:可能会抛出“ prixException”异常。

这是“ magasin”类:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package GestionMag;
import GestionMag.Produit;

import static java.lang.System.in;
import java.util.Vector;

/**
 *
 * @author USER
 */
public class Magasin {
    private int id;
    private String adresse;
    private final int capProd=2;
    private Vector<Produit> prod = new Vector<Produit>();
    private int nbProd;
    private final int capEmp=20;
    private Vector<Employe> emp = new Vector<Employe>();

    public Magasin(){}
    public Magasin(int a,String b)
    {
     id=a;
     adresse=b;
     nbProd=0;
    }
    public int getId(){return id;}
    public String getAdresse(){return adresse;}
    public int getCapProd(){return capProd;}

    public void setId(int a){id=a;}
    public void setAdresse(String a){adresse=a;}
    @Override
    public String toString()
    {
        return "\n id"+id+" adresse:"+adresse+" capProd"+capProd+"nbPrd="+nbProd;
    }
    public void afficher()
    {
        System.out.println(this.toString());
        System.out.println("----------Produits");
        for(Produit p : prod)
        {
            System.out.println(p.toString());
        }
         System.out.println("----------Employes");
        for(Employe p : emp)
        {
            System.out.println(p.toString());
        }
    }
    public boolean rechercher(Produit p)
    {
        return prod.contains(p);
    }
    public boolean chercherEmp(Employe e)
    {
         return emp.contains(e);
    }
    public boolean ajouterEmp(Employe e)
    {
        if(!chercherEmp(e))
        {emp.add(e);
         return true;}
        return false;    }
    public boolean ajouterProd(Produit p) throws ExceptionProd
    { if (nbProd>=capProd)
        throw new ExceptionProd();
        if(!this.rechercher(p))
        {
            prod.add(p);
            nbProd++;
            return true;
        }
        return false;
    }
    public void supprimerProd(Produit p)
    {
        prod.remove(p);
    }
     public void supprimerEmp(Employe p)
    {
        emp.remove(p);
    }

}

这是“产品”类:

package GestionMag;

import java.util.Date;
import GestionMag.PrixException;

/**
 *
 * @author USER
 */
public class Produit {
    private int id;
    private String libelle;
    private String marque;
    private double prix;
    private Date dateExp;

    public Produit(){};
    public Produit(int a,String b,String c,Date d) 
    {   
        id=a;
        libelle=b;
        marque=c;
        dateExp=d;
    }
    public Produit(int a,String b,String c,double  e,Date d) throws PrixException
    {
        if(prix<0)
            throw new PrixException();
        else{
        id=a;
        libelle=b;
        marque=c;
        prix=e;
        dateExp=d;
        }
    }
    @Override
    public String toString()
    {
        return "id="+id+"  libelle:"+libelle+"  marque:"+marque+"  prix"+prix+"  DateExpiration"+dateExp;
    }
    public int getId(){return id;}
    public String getLibelle(){return libelle;}
    public String getMarquue(){return marque;}
    public double getPrix(){return prix;}
    public Date getDateExp(){return dateExp;}

    public void setId(int a){id=a;}
    public void setLibelle(String a){libelle=a;}
    public void setMarque(String a){marque=a;}
    public void setPrix(double a)throws PrixException
    {  if(prix<0)
        throw new PrixException();
       else
        prix=a;
    }
    public void setDateExp(Date d){dateExp=d;}

    @Override
    public boolean equals(Object o)
    {
        if(o==null)
        {return false;}
        if(o.getClass()!=this.getClass())
            return false;
        if(o.getClass()==this.getClass())
        {
            Produit p=(Produit)o;
            if(p.getId()==this.getId())
                return true;
            else
                return false;

        }
    return false;
    }  
}

这是主要内容:

public class Prosit1 {

    public static void main(String[] args)  {
     Date d=new Date(22-22-1010);


        Produit p=new Produit(1021,"lait","delice",d);
        Produit p1=new Produit(3333,"yaourt","delice",d);
        try
        {
            Produit p2=new Produit(2222,"lait","delice",-22,d);
        }
        catch(PrixException e)
        {
            System.out.println("erreur prix < 0");
        }
        Magasin m=new Magasin(12,"Aziza al ghazella");

        try
        { m.ajouterProd(p2);
        }
        catch(ExceptionProd e)
        {
            System.out.println("erreuuur");
        }

生成错误时:找不到符号p2。 执行异常时显示:

  

java.lang.RuntimeException:无法编译的源代码-永远不会在相应的try语句的正文中抛出异常GestionMag.ExceptionProd           在prosit1.Prosit1.main(Prosit1.java:71)

1 个答案:

答案 0 :(得分:5)

简而言之,您正在尝试这样做:

try {
    Produit p2 = new Produit(2222, "lait", "delice", -22, d);
} catch (PrixException e) {
    System.out.println("erreur prix < 0");
}

try {
    m.ajouterProd(p2);
} catch (ExceptionProd e) {
    System.out.println("erreuuur");
}

第二个try块不知道p2的定义,因为它是在另一个try块中定义的。您可以通过以下方法解决它:

注意:这仅解决您的问题,而不是复制和粘贴解决方案。

可能的解决方案1:

p2任一块之外定义try

Produit p2 = null;
try {
    p2 = new Produit(2222, "lait", "delice", -22, d);
} catch (PrixException e) {
    System.out.println("erreur prix < 0");
}

try {
    m.ajouterProd(p2);
} catch (ExceptionProd e) {
    System.out.println("erreuuur");
}

可能的解决方案2:

在单个try块中执行代码并立即捕获多个异常。

try {
    Produit p2 = new Produit(2222, "lait", "delice", -22, d);
    m.ajouterProd(p2);
} catch (PrixException e) {
    System.out.println("erreur prix < 0");
} catch (ExceptionProd e) {
    System.out.println("erreuuur");
}