当前位置: 首页 > 知识库问答 >
问题:

调试器停止工作

翟奇逸
2023-03-14

我的程序需要允许用户输入员工姓名和年度总销售额。当用户完成将员工添加到阵列中时,程序应确定哪些员工的销售额最高,哪些员工的销售量最低。然后,它应该打印出两个数字之间的差异。

在我下面的代码中,我有一个保存用户输入的年销售额的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;
    }
      }

  }

共有3个答案

艾璞瑜
2023-03-14

调试器已停止,因为它在从扫描仪输入时被阻止。这在文件中有规定:

查找并返回此扫描程序中的下一个完整令牌。完整标记的前面和后面是与分隔符模式匹配的输入。此方法可能会在等待输入扫描时阻塞,即使之前对 hasNext() 的调用返回 true。

除此之外,您很幸运地输入了该代码块。您不正确地比较了字符串,因此乍一看,除非在某些特殊情况下,否则您不会进入该循环。这也是发生NPE的原因;您在错误的伪装下初始化数组的元素(==with a String),因此:

  • 您可能永远不会初始化任何东西。
  • 您只能初始化第一件事(如果(cont==“yes”)

我只介绍了几个高点,但在大多数情况下,阻塞 IO 是调试器停止的原因。一旦你开始使用 .equals,其他错误可能会变得更容易看到,但我鼓励你与同学、导师或助教一起进行面对面的代码审查。这里散布着很多关于代码的误解,这将使以后更难调试或修复。

竺勇
2023-03-14

它停止调试器,因为它等待您使用键盘输入。如果键入输入并按enter键,调试器将从此处继续。

顺便说一下,您应该仔细阅读java的命名约定和编码最佳实践

别帅
2023-03-14

创建此最大大小为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启