RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1021791
Accepted
Денис Короленко
Денис Короленко
Asked:2020-09-09 22:37:22 +0000 UTC2020-09-09 22:37:22 +0000 UTC 2020-09-09 22:37:22 +0000 UTC

运行测试时抛出 NullPointerException

  • 772

应用程序进行长除法并将整个过程打印到控制台。一切正常,测试通过,问题是当测试运行时,它会抛出 NullPointerException。我不明白在哪里以及如何处理它。NPE 在测试代码的倒数第二行弹出(String actual = subject.divide(256, 8);)。这是NPE:

`java.lang.NullPointerException
`at DivisionServiceTest.divide(DivisionServiceTest.java:30)
`at java.base/java.util.ArrayList.forEach(ArrayList.java:1380)
`at java.base/java.util.ArrayList.forEach(ArrayList.java:1380)

这是代码:

public class Division implements DivisionService {

private StringBuilder result = new StringBuilder();
private StringBuilder quotient = new StringBuilder();
private StringBuilder reminder = new StringBuilder();

public String divide(long dividend, long divider) throws IllegalArgumentException {

    if (divider == 0) {
        return "Divider cannot be 0, division by zero";
    }

    long absDividend = Math.abs(dividend);
    long absDivider = Math.abs(divider);

    if (absDividend < absDivider) {
        return "Dividend less than divider. Column Division isn't possible";
    }

    String[] dividentAsArray = String.valueOf(absDividend).split("");

    Integer reminderAsDigit;
    long multiplyResult;

    Integer dividerDigit = calculateDigit(absDivider);
    long mod;

    for (int i = 0; i < dividentAsArray.length; i++) {
        reminder.append(dividentAsArray[i]);
        reminderAsDigit = Integer.parseInt(reminder.toString());

        if (reminderAsDigit >= absDivider) {
            mod = reminderAsDigit % absDivider;
            multiplyResult = reminderAsDigit / absDivider * absDivider;

            String lastReminder = String.format("%" + (i + 2) + "s", "_" + reminderAsDigit.toString());
            result.append(lastReminder).append("\n");

            String multiply = String.format("%" + (i + 2) + "d", multiplyResult);
            result.append(multiply).append("\n");

            Integer tab = lastReminder.length() - calculateDigit(multiplyResult);
            result.append(makeDivider(reminderAsDigit, tab)).append("\n");

            quotient.append(reminderAsDigit / absDivider);

            reminder.replace(0, reminder.length(), Long.toString(mod));
            reminderAsDigit = Integer.parseInt(reminder.toString());
        } else {
            if (i >= dividerDigit) {
                quotient.append(0);
            }
        }

        if (i == dividentAsArray.length - 1) {
            result.append(String.format("%" + (i + 2) + "s", reminderAsDigit.toString())).append("\n");
        }
    }

    modifyResultToView(absDividend, absDivider);

    if (dividend > 0 && divider < 0) {
        result.insert(0, "-");
        return result.toString();
    }
    if (dividend < 0 && divider > 0) {
        result.insert(0, "-");
        return result.toString();
    } else return result.toString();
}

private String makeDivider(Integer reminderNumber, Integer tab) {
    return assemblyString(tab, ' ') + assemblyString(calculateDigit(reminderNumber), '-');
}

private void modifyResultToView(long dividend, long divider) {
    int[] index = new int[3];
    for (int i = 0, j = 0; i < result.length(); i++) {
        if (result.charAt(i) == '\n') {
            index[j] = i;
            j++;
        }

        if (j == 3) {
            break;
        }
    }

    int tab = calculateDigit(dividend) + 1 - index[0];
    result.insert(index[2], assemblyString(tab, ' ') + "│" + quotient.toString());
    result.insert(index[1], assemblyString(tab, ' ') + "│" + assemblyString(quotient.length(), '-'));
    result.insert(index[0], "│" + divider);
    result.replace(1, index[0], Long.toString(dividend));
}

private int calculateDigit(long i) {
    return (int) Math.log10(i) + 1;
}

private String assemblyString(int numberOfSymbols, char symbol) {
    StringBuilder string = new StringBuilder();
    for (int i = 0; i < numberOfSymbols; i++) {
        string.append(symbol);
    }
    return string.toString();
}
}

这是测试:

import org.junit.Before;
import org.junit.jupiter.api.Test;

import static org.junit.Assert.assertEquals;

public class DivisionServiceTest {`введите сюда код`

private DivisionService subject;

@Before
public void initSubject() throws Exception {
    subject = new Division();
}

@Test
public void divide() {

        /* Given */
        String expected =
                " 256 | 8\n" +
                        "-    |---\n" +
                        " 24  | 32\n" +
                        " --\n" +
                        " _16\n" +
                        "  16\n" +
                        "  --\n" +
                        "   0\n";

        /* When */
        String actual = subject.divide(256, 8);

        /* Then */
        assertEquals(expected, actual);
}
}
java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Vladimir
    2020-09-10T21:49:26Z2020-09-10T21:49:26Z

    看起来您的项目中有多个不同版本的 Junit,并且 @Before 注释不起作用。尽量保留一个版本的 Junit。(我检查了 Junit 4.11 版 - 您的代码可以正常工作)。

    PS:如果您已经尝试通过 new Division() 绕过 initSubject() 方法在测试方法内显式创建对象,请写下这种情况下的错误堆栈跟踪。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5