首先,这是我的函数“setProduct”:
public void setProduct(String code, int qty,double price,int nbrProduct){
System.out.println("Code = "+code);
System.out.println("qty = "+qty);
System.out.println("price = "+price);
System.out.println("nbrProduct = "+nbrProduct);
this.Produit[nbrProduct][0] = code;
this.Produit[nbrProduct][1] = Integer.toString(qty);
this.Produit[nbrProduct][2] = price+" €";
现在我打电话给我:
Commande_Final Commande = new Commande_Final();
Commande = Cmd;
String name = Commande.getName();
double prixUnit = Function.GetMagPrice(radar,Qtyradar)/Qtyradar;
System.out.println("j'affiche le radar : "+name);
System.out.println("j'affiche le Qtyradar : "+Qtyradar);
System.out.println("j'affiche le prix du radar : "+prixUnit+" €");
System.out.println("nbr de produit = "+nbr_de_Produit);
Commande.setProduit(name,Qtyradar,prixUnit,nbr_de_Produit);
我的问题:
我在“setProduct”=>中遇到错误this.Produit [nbrProduct] [0] =代码;
错误说“java.lang.NullPointerException”,我猜它试图在“this.Produit [nbrProduct] [0]”中放入一个空值,但事情就是当我执行“System.out.println”时“Code =”+ code);“它向我展示了正确的代码,并为所有其他代理人提供了相同的代码:/
编辑:
以下是我创建Produit attribut的方法:
public String [] [] Produit = new String [99] [3];
编辑2:
堆栈跟踪:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Commande_Final.setProduit(Commande_Final.java:33)
at ZDialogInfo.Confirmer(ZDialogInfo.java:449)
at ZDialogV2$29.actionPerformed(ZDialogV2.java:1037)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
代码(对不起,我用法语留下,然后你看到我使用的真实姓名):
public void Confirmer(boolean LoginCheck,String Nom,ZDialogInfo zInfo,final String Langue, Commande_Final Cmd) throws IOException{
Commande_Final Commande = Cmd;
...
if (Qtyradar > 0){
/*
* PROBLEME ICI
*
* */
String name = Commande.showName();
double prixUnit = Function.GetMagPrice(radar,Qtyradar)/Qtyradar;
System.out.println("j'affiche le radar : "+name);
System.out.println("j'affiche le Qtyradar : "+Qtyradar);
System.out.println("j'affiche le prix du radar : "+prixUnit+" €");
System.out.println("nbr de produit = "+nbr_de_Produit);
/ * ZDialogInfo.Confirmer(ZDialogInfo.java:449)=> * /
Commande.setProduit(name,Qtyradar,prixUnit,nbr_de_Produit);
nbr_de_Produit++;
System.out.println("nbr de produit = "+nbr_de_Produit);
JP_CNom.add(JL_CRadar);
JP_CNom.add(JL_CQtyRadar);
JP_CNom.add(JL_CPrixRadar);
if (RnbrItem >= 1) JP_CNom.add(RCompo1);
if (RnbrItem >= 2) JP_CNom.add(RCompo2);
if (RnbrItem >= 3) JP_CNom.add(RCompo3);
}
我的公共课Commande_Final
public class Commande_Final {
private String[][] Produit = new String[MAX_Produit][3];
/*
*
* [Nbr de Produit][0] = Code_Item
* [Nbr de Produit][1] = Qty_Cmdé
* [Nbr de Produit][2] = Prix_Unitaire
*
* */
public void setProduit(String code, int qty,double prix,int nbrProduit){
System.out.println(" ------------------- Dans setProduit ---------------------- ");
System.out.println("Code = "+code);
System.out.println("qty = "+qty);
System.out.println("prix = "+prix);
System.out.println("nbrProduit = "+nbrProduit);
/*at Commande_Final.setProduit(Commande_Final.java:33) =>*/ this.Produit[nbrProduit][0] = code;
this.Produit[nbrProduit][1] = Integer.toString(qty);
this.Produit[nbrProduit][2] = prix+"";
}
答案 0 :(得分:2)
很可能你没有正确设置数组。
最简单的例子:
Foo[] foo = new Foo[10];
它只是使用10引用Foo创建一个数组,但是这些引用没有指向实际的Foo对象。因此,当您尝试访问foo[0].bar()
类似,
Product[][] product = new Product[10][];
将给出一个指向Product []的10个引用数组。但是,没有创建实际的Product数组对象。因此,与上面的示例类似,如果执行product[1][0]
,则会获得NPE,因为product[1]
指向null,因为要访问该[0]
Product[]
而引发NPE参考。您需要明确地实例化它们。
更新
使用OP引用的额外代码,我试图运行它,并且该代码中没有NPE。
最有可能的是,您已将produit
(我强烈建议您遵循Java的通用命名约定)重新分配给null
,或者将produit[n]
分配给其他代码中的null
我建议快速检查哪一个为空:
在作业之前添加:
System.out.println("produit null ? " + (produit == null));
System.out.println("produit[n] null ? " + (produit[nbrProduit] == null));
它应该告诉你哪一个是null,并给你提示你可能有不正确的更新参考。
答案 1 :(得分:1)
我的猜测是this.Produit[nbrProduct]
是null
。
可以初始化:this.Produit[nbrProduct] = new String[someSize];
答案 2 :(得分:1)
分配null永远不会导致NPE,问题必须是您的数组尚未初始化。
在创建对象时初始化数组,因此我的猜测是在调用setProduct方法之前重新分配数组。调用setProduct时,检查this.Produit[nbrProduct]
是否为空。
PS:请使用Java约定:方法,属性和变量名称以小写开头,类/接口名称以大写开头。通常尝试使用CamelCase(常量除外,应为LIKE_THIS_EXAMPLE
)
答案 3 :(得分:1)
根据您的堆栈跟踪,NPE由此行引起:
this.Produit[nbrProduct][0] = code;
显然,您通过控制台输出发现此处的null
是this.Produit
。
由于您说过使用以下行初始化Produit
:
private String[][] Produit = new String[99][3];
那么你的NPE不应该发生,除非你通过某些代码重置了对null
的引用,如:
Commande.Produit = null;
如果您正在使用Eclipse,则可以找到对您的属性的每个写访问权限:
Produit
课程中的属性Commande_Final
,以便突出显示Search > Write Access > Project