我的程序需要允许用户输入员工姓名和年度总销售额。当用户完成将员工添加到阵列中时,程序应确定哪些员工的销售额最高,哪些员工的销售量最低。然后,它应该打印出两个数字之间的差异。
在我下面的代码中,我有一个保存用户输入的年销售额的totalPay类(它包括以前赋值中的其他变量和方法,这里没有使用)。salesPerson类保存雇员的姓名和totalPay对象,其中包括他们的年销售额。(我意识到这太复杂了,但我正在修改我之前的作业,而不是从头开始。)
当我运行这段代码时,它允许我输入姓名和销售额,但是当我输入“yes或no”来添加另一个雇员时,它崩溃了,并告诉我在第58行有一个NullPointerException,在代码中有记录。
我运行了调试器(没有任何断点),它只是停在代码中提到的第46行。它没有给出错误消息,只是没有更新该变量和我对调试器置灰的“进入”按钮,我不能再单击它们了。(如果相关的话,我正在使用NetBeans。)
任何想法将不胜感激!
编辑:这是输出和错误消息。
名字?美国队长
投入年销售额:80
是否添加其他员工?是或否
不
commission.Commission.main(Commission.java:58)线程"main"java.lang.NullPointerException异常
package commission;
//Commicaion calulator
import java.util.Scanner;
public class Commission
{
public static void main(String args [])
{
salesPerson[] emps = new salesPerson[10]; //Employee Array
String cont = "yes";
String n="";
double s=0;
int i=0;
salesPerson high = new salesPerson();
salesPerson low = new salesPerson();
// scanner object for input
Scanner keyboard = new Scanner(System.in);
//Enter in employee name
while (cont == "yes"){
System.out.print("Name? ");
n = keyboard.nextLine();
emps[i] = new salesPerson();
emps[i].setName(n);
//Loop of yes or no entering more employees
//If yes add another name if no continue with total Commision
//Enter in the sales amount of commistion
System.out.print("Input annual sales: ");
s=keyboard.nextDouble();
emps[i].pay.annual = s;
System.out.println("Add another employee? yes or no ");
keyboard.nextLine();
cont = keyboard.next(); //Line 46: Debugger stops here.
if (cont =="yes")
i++;
if (i==9){
System.out.println("You have reached the maximum number of employees.");
cont = "no";
}
}
i=0;
for (i=0; i<emps.length; i++){
if (emps[i].pay.annual > high.pay.annual) //Line 58: It claims the error is here.
high = emps[i];
if (emps[i].pay.annual < low.pay.annual)
low = emps[i];
}
double diff = high.pay.annual - low.pay.annual;
System.out.println("Employee "+low.getName()+" needs to earn "+diff+" more to match Employee "+high.getName());
// Output table for composation with increments of $5000
// int tempAnnual =(int) pay.annual;
// for (i=tempAnnual; i<= pay.annual; i+=5000)
// System.out.println(i+" "+ pay.getReward(i));
}
public static class totalPay
{
double salary=50000.0; //Yearly earned 50000 yr fixed income
double bonusRate1=.05; //bounus commission rate of 5% per sale
double commission; //Commission earned after a sale
double annual; //Sales inputted
double reward; // Yearly pay with bonus
double bonusRate2= bonusRate1 + 1.15 ; // Sales target starts at 80%
public double getReward(double annual)
{
double rate;
if (annual < 80000)
rate=0;
else if ((annual >= 80000) || (annual < 100000 ))
rate=bonusRate1;
else
rate=bonusRate2;
commission = annual * rate;
reward=salary + commission;
return reward;
}
}
public static class salesPerson
{
String name; //Employee Name
totalPay pay = new totalPay();
public void setName(String n) //Name
{
name=n;
}
public String getName()
{
return name;
}
}
}
调试器已停止,因为它在从扫描仪输入时被阻止。这在文件中有规定:
查找并返回此扫描程序中的下一个完整令牌。完整标记的前面和后面是与分隔符模式匹配的输入。此方法可能会在等待输入扫描时阻塞,即使之前对 hasNext()
的调用返回 true。
除此之外,您很幸运地输入了该代码块。您不正确地比较了字符串,因此乍一看,除非在某些特殊情况下,否则您不会进入该循环。这也是发生NPE的原因;您在错误的伪装下初始化数组的元素(==
with a String),因此:
如果(cont==“yes”)
)我只介绍了几个高点,但在大多数情况下,阻塞 IO 是调试器停止的原因。一旦你开始使用 .equals
,其他错误可能会变得更容易看到,但我鼓励你与同学、导师或助教一起进行面对面的代码审查。这里散布着很多关于代码的误解,这将使以后更难调试或修复。
它停止调试器,因为它等待您使用键盘输入。如果键入输入并按enter键,调试器将从此处继续。
顺便说一下,您应该仔细阅读java的命名约定和编码最佳实践
创建此最大大小为10的数组:
salesPerson[] emps = new salesPerson[10];
但仅为每个输入的SalesPerson对象创建和分配一个对象引用。由于您只输入1个名称,因此数组中只有第1个条目有效,因此剩余的9个为空。然后您尝试遍历整个数组(emps.length为10):
for (i=0; i<emps.length; i++){
if (emps[i].pay.annual > high.pay.annual)
当索引第一个空引用时,这会导致NPE。您需要将循环更改为:
int numEntered = i; //last increment
for (i=0; i< numEnetered; i++){
if (emps[i].pay.annual > high.pay.annual)
在以前版本的Visual Studio(或者我几年前设置的一些设置)中,当我停止调试Web应用程序时,实际的IIS Express实例将继续运行。我真的很喜欢这种行为,因为这意味着当我编辑代码/重新编译ect时,站点总是在运行以进行修补。 自从升级到VS 2013后,这种情况似乎不再发生,当我停止调试时,它也停止了IIS express应用程序池。 有没有人知道某处有没有改变这种行为的设定?
我正在尝试测试下面的http请求方法 但是,调试器似乎跳过了第二个注释下面的代码。我正在使用Visual Studio 2015 RC,有什么想法吗?我也试着检查任务窗口,什么也没看到 编辑:找到解决方案 事实证明,因为这是一个C#控制台应用程序,所以我猜它在主线程结束后结束,因为在添加控制台之后。ReadLine()并等待一段时间,请求确实返回了。我猜想C#会等到我的任务执行后才结束,但我想我错
vscode调试一个程序,但是程序运行完后,却无法结束.终端可以正常使用.这个调试控制板无法关闭,如果再发起一次调试,就会如下所示 这是为什么,如何解决
问题内容: 有时,当我调用Selenium FindElements(By)时,它将引发异常,并且驱动程序停止工作。参数“ BY”可能是问题所在:当我使用其他BY搜索相同的元素时,它起作用了。 我也可以看到,即使我的元素存在,或者之前曾调用过带有相同参数的相同方法,也不会阻止该方法引发异常。 我的方法是: 一个BY值的示例并非始终有效(即使它存在于页面中): 例外: WebDriverExcept
问题内容: 我正在尝试拍摄JUnit。在源代码中,我在两个位置设置了断点:1)在初始化静态成员的行中2)在一个测试用例的第一行中。 调试器在静态字段初始化行中停止。但这并不会在测试用例中停止。无论我在测试用例中的何处设置断点,调试器都不会在那里停下来。我肯定知道测试用例已执行,因为我可以看到添加的日志消息出现在日志中。 任何帮助将不胜感激。 我正在使用Eclipse Galileo和JUnit4启