Html.fromHtml一直抛出空指针异常

3

假设我有一个字符串,其中包含了粗体字格式。但是在某些情况下,我需要去掉这种格式。以下是我尝试过的方法,但总是遇到空指针异常错误。

这是我的方法:

public String stripFormatting(String input){
    return Html.fromHtml(input).toString();
}

这里是一个调用。
stripFormatting("<b>0</b>")

错误追踪并没有提供太多信息,但是在这里。
java.lang.NullPointerException
at com.mypkg.utils.MyClassTest.stripFormatting(MyClassTest.java:111)
at com.mypkg.utils.MyClassTest.testLessThan100_000(MyClassTest.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
1个回答

5

看到你试图从单元测试中运行这个代码-调用Html.fromHtml不会按照预期工作,因为单元测试无法使用依赖于Android的代码。

根据构建本地单元测试https://developer.android.com/training/testing/unit-testing/local-unit-tests.html下的模拟Android依赖项-

默认情况下,Gradle的Android插件将执行您的本地单元测试针对android.jar库的修改版本,该版本不包含任何实际代码。而是来自单元测试的Android类的方法调用会抛出异常。这是为了确保只测试您的代码,并且不依赖于Android平台的任何特定行为(您没有明确模拟的那些)。

不过这很容易解决-只需将测试从单元测试更改为仪器测试(即,在androidTest目录下),它将实际使用完整的android.jar而不是像单元测试一样使用存根。它运行起来会慢一些,但应该至少能正确执行。

某些东西是可模拟的(例如,通过上述链接中描述的Mockito从 s中的 getString 获取),但对于静态方法则不起作用。我猜如果您正在测试HTML剥离,则需要实际测试它是否按预期执行,因此仪器测试是正确的选择。


我按照你的建议做了。从Android Studio中,我将目录移动到(androidTest)的子目录下。但现在它一直显示:“未找到类...空测试套件”。 - Nouvel Travay
1
你可能需要在测试类声明之前(即在public class ...Test {上方)使用@RunWith(AndroidJUnit4.class)注释来告诉Android Studio这是一个仪器测试。你可以在这里找到更多信息:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html - Jarrod Robins
我一直在查看官方文档和Stack Overflow,但运气不好。它一直提示“找不到类:mypackage.MyClass”,并显示“空测试套件”。 - Nouvel Travay
对于那些遇到与@NouvelTravay相同问题的人,每次将测试从“test”移动到“androidTest”目录或反之亦然时,请进入“编辑配置”并删除任何在配置下提到的测试,然后再次运行您的测试。这样就可以解决问题了。 - LoveForDroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接